diff --git a/utils/changelog b/utils/changelog
index 9607063d3032aa30670a86b948c35de652bd9dd0..65234ef31ac756dc3b12884b9ad2ffb9e52396cf 100755
--- a/utils/changelog
+++ b/utils/changelog
@@ -25,48 +25,6 @@ import argparse
 import subprocess
 
 
-usage = "Usage: changelog [options] [<new version>]"
-parser = argparse.ArgumentParser(usage=usage)
-parser.add_argument("--tag", dest="tag",
-                    help="git tag")
-options, args = parser.parse_known_args()
-
-if len(args) == 1:
-    new_version = args[0]
-elif len(args) != 0:
-    parser.error("new version is not set")
-else:
-    new_version = None
-
-if options.tag is None:
-    tag = subprocess.check_output(
-        "git describe --tags $(git rev-list --tags --max-count=1)",
-        shell=True)
-    options.tag = tag.decode("utf-8").strip()
-
-version = options.tag[1:]
-
-command = ["git", "log", "%s.." % options.tag]
-process = subprocess.run(command,
-                         stdout=subprocess.PIPE,
-                         stderr=subprocess.PIPE)
-
-if process.returncode != 0:
-    print("git log failed: %s" % process.stderr.decode("utf8").split("\n")[0])
-    sys.exit(1)
-
-if new_version is not None:
-    s = "ansible-freeipa-%s" % new_version
-    print(s)
-    print("=" * len(s))
-    print()
-
-commits = {}
-prs = {}
-authors = {}
-
-lines = process.stdout.decode("utf-8").split("\n")
-
 class Ref:
     def __init__(self, commit):
         self.commit = commit
@@ -75,11 +33,11 @@ class Ref:
 def store(commits, prs, authors, commit, author, merge, msg):
     if commit is not None:
         if msg[0].startswith("Merge pull request #"):
-            pr = int(msg[0].split()[3][1:])
+            pr_ref = int(msg[0].split()[3][1:])
             if len(msg) > 1:
-                prs[pr] = msg[1].strip()
+                prs[pr_ref] = msg[1].strip()
             else:
-                prs[pr] = Ref(merge)
+                prs[pr_ref] = Ref(merge)
         else:
             commits[commit] = msg[0].strip()
             authors.setdefault(author, []).append(commit)
@@ -93,57 +51,125 @@ def get_commit(commits, commit):
     return commit
 
 
-commit = None
-author = None
-merge = None
-msg = None
-for line in lines:
-    line = line.rstrip()
-    if line.startswith("commit "):
+def get_output(command):
+    try:
+        ret = subprocess.check_output(command, shell=True)
+        ret = ret.decode("utf-8").strip()
+    except subprocess.CalledProcessError:
+        print("Command '%s' failed" % command)
+        sys.exit(1)
+    return ret
+
+
+def changelog(tag):
+    prev_tag = None
+    if tag is not None and tag != "":
+        prev_tag = get_output(
+            "git describe --tag --abbrev=0 --always '%s^'" % tag)
+    else:
+        tag = get_output("git describe --tags --abbrev=0 "
+                         "$(git rev-list --tags --max-count=1)")
+
+    version = tag[1:]
+
+    if prev_tag is not None:
+        command = ["git", "log", "%s..%s" % (prev_tag, tag)]
+    else:
+        command = ["git", "log", "%s.." % tag]
+    process = subprocess.run(command,
+                             stdout=subprocess.PIPE,
+                             stderr=subprocess.PIPE)
+
+    if process.returncode != 0:
+        print("git log failed: %s" %
+              process.stderr.decode("utf8").split("\n")[0])
+        sys.exit(1)
+
+    lines = process.stdout.decode("utf-8").split("\n")
+
+    commits = {}
+    prs = {}
+    authors = {}
+    commit = None
+    author = None
+    merge = None
+    msg = None
+    for line in lines:
+        line = line.rstrip()
+        if line.startswith("commit "):
+            store(commits, prs, authors, commit, author, merge, msg)
+            author = None
+            msg = []
+            commit = line[7:]
+        elif line.startswith("    "):
+            msg.append(line[4:])
+        else:
+            try:
+                key, value = line.split(":", 1)
+                if key == "Author":
+                    author = value.split("<")[0].strip()
+                elif key == "Merge":
+                    merge = value.split()[1].strip()
+                # Ignore Date, ..
+            except ValueError:
+                pass
+
+    # Add final commit
+    if commit:
         store(commits, prs, authors, commit, author, merge, msg)
-        author = None
-        msg = []
-        commit = line[7:]
-    elif line.startswith("    "):
-        msg.append(line[4:])
+
+    if prev_tag is not None:
+        line = "Changes for %s since %s" % (version, prev_tag[1:])
     else:
-        try:
-            key, value = line.split(":", 1)
-            if key == "Author":
-                author = value.split("<")[0].strip()
-            elif key == "Merge":
-                merge = value.split()[1].strip()
-            # Ignore Date, ..
-        except ValueError:
-            pass
-
-# Add final commit
-if commit:
-    store(commits, prs, authors, commit, author, merge, msg)
-
-s = "Changes since %s" % version
-print("%s" % s)
-print("-" * len(s))
-print()
-
-prs_sorted = sorted(prs.keys(), reverse=True)
-for pr in prs_sorted:
-    if isinstance(prs[pr], Ref):
-        msg = get_commit(commits, prs[pr].commit)
+        line = "Changes since %s" % version
+    print("%s" % line)
+    print("-" * len(line))
+    print()
+
+    prs_sorted = sorted(prs.keys(), reverse=True)
+    for pr_ref in prs_sorted:
+        if isinstance(prs[pr_ref], Ref):
+            msg = get_commit(commits, prs[pr_ref].commit)
+        else:
+            msg = prs[pr_ref]
+        print("  - %s (#%d)" % (msg, pr_ref))
+    print()
+
+    if prev_tag is not None:
+        line = "Detailed changelog for %s since %s by author" % (version,
+                                                                 prev_tag[1:])
     else:
-        msg = prs[pr]
-    print("  - %s (#%d)" % (msg, pr))
-print()
-
-s = "Detailed changelog since %s by author" % version
-print("%s" % s)
-print("-" * len(s))
-print("  %d authors, %d commits" % (len(authors), len(commits)))
-print()
-
-authors_sorted = sorted(authors.keys())
-for author in authors_sorted:
-    print("%s (%d)\n" % (author, len(authors[author])))
-    for commit in authors[author]:
-        print("  - %s" % commits[commit])
+        line = "Detailed changelog since %s by author" % version
+    print("%s" % line)
+    print("-" * len(line))
+    print("  %d authors, %d commits" % (len(authors), len(commits)))
     print()
+
+    authors_sorted = sorted(authors.keys())
+    for author in authors_sorted:
+        print("%s (%d)\n" % (author, len(authors[author])))
+        for commit in authors[author]:
+            print("  - %s" % commits[commit])
+        print()
+
+
+parser = argparse.ArgumentParser(usage="Usage: changelog [options]")
+parser.add_argument("--tag", dest="tag", help="git tag")
+parser.add_argument("--galaxy", dest="galaxy", action="store_true",
+                    help="Create changelog for galaxy")
+options, args = parser.parse_known_args()
+
+if len(args) != 0:
+    parser.print_help()
+    sys.exit(1)
+
+if options.galaxy:
+    # Get latest tag
+    tag = get_output("git describe --tag --abbrev=0")
+    # get number of commits since latest tag
+    count = get_output("git rev-list '%s'.. --count" % tag)
+    if count != "0":
+        changelog(None)
+    changelog(tag)
+else:
+    changelog(options.tag)