+sub create_upgrade {
+  my (%params) = @_;
+
+  my $filename    = $params{filename};
+  my $dbupgrader  = $params{dbupgrader};
+  my $type        = $params{type}        || 'sql';
+  my $description = $params{description} || '';
+  my @depends     = @{ $params{depends} };
+
+  my $encoding    = 'utf-8';
+
+  if (!@depends) {
+    my @releases = grep { /^release_/ } keys %$controls;
+    @depends = ((sort @releases)[-1]);
+  }
+
+  my $comment;
+  if ($type eq 'sql') {
+    $comment = '--';
+  } elsif ($type eq 'pl') {
+    $comment = '#';
+  } elsif (!$type) {
+    die 'Error: No --type was given but is required for --create.';
+  } else {
+    die 'Error: Unknown --type. Try "sql" or "pl".';
+  }
+
+  my $full_filename = $dbupgrader->path . '/' . $filename . '.' . $type;
+
+  die "file '$full_filename' already exists, aborting" if -f $full_filename;
+
+
+  open my $fh, ">:encoding($encoding)", $full_filename or die "can't open $full_filename";
+  print $fh "$comment \@tag: $filename\n";
+  print $fh "$comment \@description: $description\n";
+  print $fh "$comment \@depends: @depends\n";
+
+  if ($type eq 'pl') {
+    print $fh "package SL::DBUpgrade2::$filename;\n";
+    print $fh "\n";
+    print $fh "use strict;\n";
+    print $fh "use utf8;\n" if $encoding =~ /utf.?8/i;
+    print $fh "\n";
+    print $fh "use parent qw(SL::DBUpgrade2::Base);\n";
+    print $fh "\n";
+    print $fh "sub run {\n";
+    print $fh "  my (\$self) = \@_;\n";
+    print $fh "\n";
+    print $fh "}\n";
+    print $fh "\n";
+    print $fh "1;\n";
+  }
+
+  close $fh;
+
+  print "File $full_filename created.\n";
+
+  system("\$EDITOR $full_filename");
+  exit 0;
+}
+