diff --git a/interfaces.go b/interfaces.go
index 4c7dbee..d73f11d 100644
--- a/interfaces.go
+++ b/interfaces.go
@@ -244,4 +244,29 @@
 	// GetSGRule obtains information for a specified security group rule.
 	// This method only works if the provider supports the os-security-groups-default-rules extension.
 	GetSGRule(string) (*SGRule, error)
+
+	// Pause stores the state of the server in RAM.  A paused instance continues to run in a frozen state.
+	Pause(id string) error
+
+	// Unpause restores normal behavior of a previously paused server.
+	Unpause(id string) error
+
+	// Suspend stores the state of the server on disk or other non-volatile medium.
+	// Administrative users might suspend an infrequently used instance or suspend an instance to perform system maintenance.
+	// Suspending an instance is similar to placing a device in hibernation;
+	// memory and vCPUs become available to create other instances.
+	Suspend(id string) error
+
+	// Resume restores normal behavior of a previously suspended server.
+	Resume(id string) error
+
+	// Start restores a previously stopped server to normal operation.
+	// WARNING: This function depends on a Nova action which remains undocumented on the OpenStack API Reference website,
+	// and may be deprecated in favor of Pause/Unpause, or Suspend/Resume.
+	Start(id string) error
+
+	// Stop stops a server.
+	// WARNING: This function depends on a Nova action which remains undocumented on the OpenStack API Reference website,
+	// and may be deprecated in favor of Pause/Unpause, or Suspend/Resume.
+	Stop(id string) error
 }
diff --git a/servers.go b/servers.go
index 1f6a7a4..0861fa2 100644
--- a/servers.go
+++ b/servers.go
@@ -418,6 +418,104 @@
 }
 
 // See the CloudServersProvider interface for details.
+func (gsp *genericServersProvider) Pause(id string) error {
+	return gsp.context.WithReauth(gsp.access, func() error {
+		ep := fmt.Sprintf("%s/servers/%s/action", gsp.endpoint, id)
+		return perigee.Post(ep, perigee.Options{
+			ReqBody: &struct {
+				Pause *int `json:"pause"`
+			}{nil},
+			MoreHeaders: map[string]string{
+				"X-Auth-Token": gsp.access.AuthToken(),
+			},
+			OkCodes: []int{202},
+		})
+	})
+}
+
+// See the CloudServersProvider interface for details.
+func (gsp *genericServersProvider) Unpause(id string) error {
+	return gsp.context.WithReauth(gsp.access, func() error {
+		ep := fmt.Sprintf("%s/servers/%s/action", gsp.endpoint, id)
+		return perigee.Post(ep, perigee.Options{
+			ReqBody: &struct {
+				Unpause *int `json:"unpause"`
+			}{nil},
+			MoreHeaders: map[string]string{
+				"X-Auth-Token": gsp.access.AuthToken(),
+			},
+			OkCodes: []int{202},
+		})
+	})
+}
+
+// See the CloudServersProvider interface for details.
+func (gsp *genericServersProvider) Suspend(id string) error {
+	return gsp.context.WithReauth(gsp.access, func() error {
+		ep := fmt.Sprintf("%s/servers/%s/action", gsp.endpoint, id)
+		return perigee.Post(ep, perigee.Options{
+			ReqBody: &struct {
+				Suspend *int `json:"suspend"`
+			}{nil},
+			MoreHeaders: map[string]string{
+				"X-Auth-Token": gsp.access.AuthToken(),
+			},
+			OkCodes: []int{202},
+		})
+	})
+}
+
+// See the CloudServersProvider interface for details.
+func (gsp *genericServersProvider) Resume(id string) error {
+	return gsp.context.WithReauth(gsp.access, func() error {
+		ep := fmt.Sprintf("%s/servers/%s/action", gsp.endpoint, id)
+		return perigee.Post(ep, perigee.Options{
+			ReqBody: &struct {
+				Resume *int `json:"resume"`
+			}{nil},
+			MoreHeaders: map[string]string{
+				"X-Auth-Token": gsp.access.AuthToken(),
+			},
+			OkCodes: []int{202},
+		})
+	})
+}
+
+// WARNING: This function remains undocumented on the OpenStack API reference website, http://developer.openstack.org/api-ref-compute-v2-ext.html .
+// See the CloudServersProvider interface for details.
+func (gsp *genericServersProvider) Start(id string) error {
+	return gsp.context.WithReauth(gsp.access, func() error {
+		ep := fmt.Sprintf("%s/servers/%s/action", gsp.endpoint, id)
+		return perigee.Post(ep, perigee.Options{
+			ReqBody: &struct {
+				Start *int `json:"start"`
+			}{nil},
+			MoreHeaders: map[string]string{
+				"X-Auth-Token": gsp.access.AuthToken(),
+			},
+			OkCodes: []int{202},
+		})
+	})
+}
+
+// WARNING: This function remains undocumented on the OpenStack API reference website, http://developer.openstack.org/api-ref-compute-v2-ext.html .
+// See the CloudServersProvider interface for details.
+func (gsp *genericServersProvider) Stop(id string) error {
+	return gsp.context.WithReauth(gsp.access, func() error {
+		ep := fmt.Sprintf("%s/servers/%s/action", gsp.endpoint, id)
+		return perigee.Post(ep, perigee.Options{
+			ReqBody: &struct {
+				Stop *int `json:"stop"`
+			}{nil},
+			MoreHeaders: map[string]string{
+				"X-Auth-Token": gsp.access.AuthToken(),
+			},
+			OkCodes: []int{202},
+		})
+	})
+}
+
+// See the CloudServersProvider interface for details.
 func (gsp *genericServersProvider) ListSecurityGroups() ([]SecurityGroup, error) {
 	var sgs []SecurityGroup
 
