Index: source/ch/cyberduck/core/Preferences.java
===================================================================
--- source/ch/cyberduck/core/Preferences.java	(revision 14153)
+++ source/ch/cyberduck/core/Preferences.java	(working copy)
@@ -615,6 +615,7 @@
         defaults.put("openstack.container.size.preload", String.valueOf(true));
 
         defaults.put("openstack.upload.md5", String.valueOf(true));
+        defaults.put("openstack.upload.cleanup", String.valueOf(true));
 
         defaults.put("openstack.upload.largeobject", String.valueOf(true));
         defaults.put("openstack.upload.largeobject.concurrency", String.valueOf(5));
Index: source/ch/cyberduck/core/openstack/SwiftLargeObjectUploadFeature.java
===================================================================
--- source/ch/cyberduck/core/openstack/SwiftLargeObjectUploadFeature.java	(revision 14153)
+++ source/ch/cyberduck/core/openstack/SwiftLargeObjectUploadFeature.java	(working copy)
@@ -20,6 +20,7 @@
 
 import ch.cyberduck.core.DefaultIOExceptionMappingService;
 import ch.cyberduck.core.DisabledListProgressListener;
+import ch.cyberduck.core.DisabledLoginController;
 import ch.cyberduck.core.Local;
 import ch.cyberduck.core.Path;
 import ch.cyberduck.core.PathContainerService;
@@ -162,6 +163,12 @@
         // Create and upload the large object manifest. It is best to upload all the segments first and
         // then create or update the manifest.
         try {
+            // Cleanup if necessary
+            final List<Path> segmentsToDelete = new ArrayList<Path>();
+            boolean deleteOrphanedSegments = Preferences.instance().getBoolean("openstack.upload.cleanup");
+            if (deleteOrphanedSegments) {
+                segmentsToDelete.addAll(segmentService.list(file));
+            }
             // Static Large Object.
             final String manifest = segmentService.manifest(containerService.getContainer(file).getName(), completed);
             if(log.isDebugEnabled()) {
@@ -174,6 +181,15 @@
                     status.getMime(),
                     containerService.getKey(file), manifest, Collections.<String, String>emptyMap());
             stored.setMd5sum(checksum);
+
+            if (deleteOrphanedSegments) {
+                segmentsToDelete.removeAll(segmentService.list(file));
+                if (!segmentsToDelete.isEmpty()) {
+                    // Clean up any old segments
+                    new SwiftMultipleDeleteFeature(session).delete(segmentsToDelete, new DisabledLoginController());
+                }
+            }
+
             return stored;
         }
         catch(GenericException e) {
Index: source/ch/cyberduck/core/openstack/SwiftWriteFeature.java
===================================================================
--- source/ch/cyberduck/core/openstack/SwiftWriteFeature.java	(revision 14153)
+++ source/ch/cyberduck/core/openstack/SwiftWriteFeature.java	(working copy)
@@ -21,6 +21,7 @@
 import ch.cyberduck.core.Cache;
 import ch.cyberduck.core.DefaultIOExceptionMappingService;
 import ch.cyberduck.core.DisabledListProgressListener;
+import ch.cyberduck.core.DisabledLoginController;
 import ch.cyberduck.core.Path;
 import ch.cyberduck.core.PathContainerService;
 import ch.cyberduck.core.Preferences;
@@ -39,6 +40,7 @@
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.List;
+import java.util.ArrayList;
 
 import ch.iterate.openstack.swift.exception.GenericException;
 import ch.iterate.openstack.swift.model.StorageObject;
@@ -110,12 +112,20 @@
             @Override
             public StorageObject call(final AbstractHttpEntity entity) throws BackgroundException {
                 try {
+                    final List<Path> segments = new ArrayList<Path>();
+                    if (Preferences.instance().getBoolean("openstack.upload.cleanup")) {
+                        segments.addAll(segmentService.list(file));
+                    }
                     final String checksum = session.getClient().storeObject(new SwiftRegionService(session).lookup(containerService.getContainer(file)),
                             containerService.getContainer(file).getName(), containerService.getKey(file),
                             entity, metadata, null);
                     final StorageObject stored = new StorageObject(containerService.getKey(file));
                     stored.setMd5sum(checksum);
                     stored.setSize(status.getLength());
+                    if (!segments.isEmpty()) {
+                        // Clean up any old segments
+                        new SwiftMultipleDeleteFeature(session).delete(segments, new DisabledLoginController());
+                    }
                     return stored;
                 }
                 catch(GenericException e) {
