diff --git a/client/image.go b/client/image.go
index 9a43dac41d282120de9ecc374786d8f6abb543d6..f925544536722264b8d6ef3073fe1be667ce7786 100644
--- a/client/image.go
+++ b/client/image.go
@@ -48,6 +48,44 @@ func (r *Remote) Image(flake string) (store.Image, error) {
 	return image, err
 }
 
+// ImageGroup returns an entire group of store.Image.
+func (r *Remote) ImageGroup(flake string) ([]store.Image, error) {
+	if image, err := r.Image(flake); err != nil {
+		return nil, err
+	} else {
+		var group []store.Image
+
+		// Iterate forwards
+		if err = func(image store.Image) error {
+			group = []store.Image{image}
+			for image.Child != "" {
+				if image, err = r.Image(image.Child); err != nil {
+					return err
+				}
+				group = append(group, image)
+			}
+			return nil
+		}(image); err != nil {
+			return group, err
+		}
+
+		// Iterate backwards
+		if err = func(image store.Image) error {
+			for image.Parent != "" {
+				if image, err = r.Image(image.Parent); err != nil {
+					return err
+				}
+				group = append([]store.Image{image}, group...)
+			}
+			return nil
+		}(image); err != nil {
+			return group, err
+		}
+
+		return group, nil
+	}
+}
+
 // ImageUpdate updates metadata of store.Image with given snowflake. To persist original value in a field set \000.
 func (r *Remote) ImageUpdate(flake, source, parent, commentary, commentaryTranslation string) error {
 	payload := api.ImageUpdatePayload{