diff --git a/base.nim b/base.nim
index 0b9e4b8..644325c 100644
--- a/base.nim
+++ b/base.nim
@@ -183,6 +183,7 @@ proc runDMenu*(data: Info, opts: varargs[string], rofi: bool = false): string =
 
 proc copyToClipboard*(str: string) =
     discard execCmd("echo -n " & quote(str) & " | xclip -selection clipboard")
+
 proc outputData*(data: Info, args: varargs[string]): string {.discardable.} =
   var output = ""
   if rofi:
diff --git a/screenshot.nim b/screenshot.nim
new file mode 100755
index 0000000..af57817
--- /dev/null
+++ b/screenshot.nim
@@ -0,0 +1,91 @@
+import base
+import std/[times,os,osproc,strutils,sequtils]
+
+var screenshot_type = ""
+const TYPES = @["region", "fullscreen", "window"]
+const DATE_FORMAT = "yyyyMMdd-hhmmss"
+const FILENAME = "Screenshot-%d.png"
+const TEMP_DIR = "/tmp/"
+const SCREENSHOT_CMD = "maim -u %s --format png %f"
+let DATE_STR = now().format(DATE_FORMAT)
+# where %s is an extra flag or process, i.e. xdotool for getting active window
+const ACTIVE_WINDOW_CMD = "-i $(xdotool getactivewindow)"
+const REGION_FLAG = "-s"
+
+proc saveToClipboard(filename: string) =
+  let cmd = "cat " & filename & " | xclip -selection clipboar -t image/png"
+  let status = execCmd(cmd)
+  if status == 0 and fileExists(filename):
+    removeFile(filename)
+  return
+
+proc saveToFile(filename: string) =
+  if fileExists(filename):
+    let new_filename = filename.replace("/tmp/", getHomeDir() & "Screenshots/")
+    copyFile(filename, new_filename)
+    if fileExists(new_filename):
+      removeFile(filename)
+  return
+
+proc openFile(filename: string) =
+  let cmd = "xdg-open " & filename
+  discard execCmd(cmd)
+  return
+
+proc showScreenshotSaveSel(filename: string) =
+  let info = newInfo("Save Screenshot")
+  let args = @["clipboard", "save", "open", "---", "exit"]
+  let choice = outputData(info,args)
+  if choice == "---":
+    showScreenshotSaveSel(filename)
+  elif choice == "exit":
+    return
+  elif choice in args:
+    case choice:
+      of "clipboard":
+        saveToClipboard(filename)
+      of "save":
+        saveToFile(filename)
+      of "open":
+        openFile(filename)
+  return
+
+proc showScreenshotTypeSel() =
+  let info = newInfo("Screenshot type")
+  let args = concat(TYPES,@["---","exit"])
+  let choice = outputData(info,args)
+  if choice in TYPES:
+    screenshot_type = choice
+  elif choice == "---":
+    showScreenshotTypeSel()
+  elif choice == "exit":
+    return
+  return
+
+proc takeScreenshot() =
+  let filename = TEMP_DIR & FILENAME.replace("%d",DATE_STR)
+  var cmd = SCREENSHOT_CMD.replace("%f",filename)
+  case screenshot_type:
+    of "window":
+      cmd = cmd.replace("%s",ACTIVE_WINDOW_CMD)
+    of "region":
+      cmd = cmd.replace("%s",REGION_FLAG)
+    else: #fullscreen
+      cmd = cmd.replace("%s","")
+      # sleep for a bit otherwise the screen shot grabs dmenu as well
+      sleep(1*500)
+
+  let status = execCmd(cmd)
+  if status == 0:
+    showScreenshotSaveSel(filename)
+  return
+
+if isMainModule:
+  for arg in args:
+    if arg in TYPES:
+      screenshot_type = arg
+      break
+  if screenshot_type == "":
+    showScreenshotTypeSel()
+  if screenshot_type != "":
+    takeScreenshot()