diff --git a/calendar/README.md b/calendar/README.md
new file mode 100644
index 0000000..906c71d
--- /dev/null
+++ b/calendar/README.md
@@ -0,0 +1,47 @@
+## awesome-calendar
+
+Small calendar popup for awesome window manager.
+
+![Screenshot](/screenshot.png?raw=true "Screenshot")
+
+This is a polished up and improved module based on the `calendar2.lua` module
+by Bernd Zeimetz and Marc Dequènes.
+
+### Installation
+
+Drop the script into your awesome config folder. Suggestion:
+
+```bash
+cd ~/.config/awesome
+git clone https://github.com/deficient/calendar.git
+```
+
+
+### Usage
+
+In your `rc.lua`:
+
+```lua
+-- load the widget code
+local calendar = require("calendar")
+
+-- attach it as popup to your text clock widget:
+calendar({}):attach(mytextclock)
+```
+
+You can also add some options to customize the widget's display. For instance:
+
+```
+local calendar = require("calendar")
+calendar_widget = calendar({
+ fdow = 7, -- Set Sunday as first day of the week (default is
+ -- 1 = Monday)
+ position = "bottom_right", -- Useful if you prefer your wibox at the bottomn
+ -- of the screen
+})
+calendar_widget:attach(mytextclock)
+```
+
+### Requirements
+
+* [awesome 4.0](http://awesome.naquadah.org/). May work on 3.5 with minor changes.
diff --git a/calendar/UNLICENSE b/calendar/UNLICENSE
new file mode 100644
index 0000000..68a49da
--- /dev/null
+++ b/calendar/UNLICENSE
@@ -0,0 +1,24 @@
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to
diff --git a/calendar/calendar.lua b/calendar/calendar.lua
new file mode 100644
index 0000000..0a3e3e9
--- /dev/null
+++ b/calendar/calendar.lua
@@ -0,0 +1,175 @@
+-- original code made by Bzed and published on http://awesome.naquadah.org/wiki/Calendar_widget
+-- modified by Marc Dequènes (Duck) (2009-12-29), under the same licence,
+-- and with the following changes:
+-- + transformed to module
+-- + the current day formating is customizable
+-- also modified by tforgione for it to work in french
+
+-- captures
+local os = os
+local capi = {
+ mouse = mouse,
+ screen = screen,
+}
+local awful = require("awful")
+local naughty = require("naughty")
+
+local version_major, version_minor = awesome.version:match("(%d+)%.(%d+)")
+version_major = tonumber(version_major)
+version_minor = tonumber(version_minor)
+local can_update_size = version_major and version_minor and version_major >= 4 and version_minor >= 2
+
+------------------------------------------
+-- utility functions
+------------------------------------------
+
+local function format_date(format, date)
+ return os.date(format, os.time(date))
+end
+
+
+------------------------------------------
+-- calendar popup widget
+------------------------------------------
+
+local calendar = {}
+
+function calendar:new(args)
+ return setmetatable({}, {__index = self}):init(args)
+end
+
+function calendar:init(args)
+ self.num_lines = 0
+ self.today_color = args.today_color or "#00ff00"
+ -- first day of week: monday=1, …, sunday=7
+ self.fdow = args.fdow or 1
+ -- notification area:
+ self.html = args.html or '\n%s'
+ -- highlight current date:
+ self.today = args.today or '%2i'
+ self.anyday = args.anyday or '%2i'
+ self.page_title = args.page_title or '%B %Y' -- month year
+ self.col_title = args.col_title or '%a ' -- weekday
+ -- Date equality check is based on day_id. We deliberately ignore the year
+ -- to highlight the same day in different years:
+ self.day_id = args.day_id or '%m-%d'
+ self.empty_sep = args.empty_sep or " -"
+ self.week_col = args.week_col or " %V"
+ self.days_style = args.days_style or {}
+ self.position = args.position or naughty.config.defaults.position
+ return self
+end
+
+function calendar:day_style(day_of_week)
+ return self.days_style[day_of_week] or '%s'
+end
+
+function calendar:page(month, year)
+
+ local today = format_date(self.day_id)
+
+ -- 2001 started with a monday:
+ local d0 = format_date("*t", {year=2001, month=1, day=self.fdow })
+ local dA = format_date("*t", {year=year, month=month, day=1 })
+ local dB = format_date("*t", {year=year, month=month+1, day=0 })
+ local tA = {year=year, month=month, day=1 }
+ local colA = (dA.wday - d0.wday) % 7
+
+ local page_title = format_date(self.page_title, tA)
+
+ -- print column titles (weekday)
+ local page = " "
+ for d = 0, 6 do
+ page = page .. self:day_style(d+1):format(format_date(self.col_title, {
+ year = d0.year,
+ month = d0.month,
+ day = d0.day + d,
+ }))
+ end
+
+ -- print empty space before first day
+ page = page .. "\n" .. format_date(self.week_col, tA)
+ for column = 1, colA do
+ page = page .. self.empty_sep
+ end
+
+ -- iterate all days of the month
+ local nLines = 1
+ local column = colA
+ for day = 1, dB.day do
+ if column == 7 then
+ column = 0
+ nLines = nLines + 1
+ page = page .. "\n" .. format_date(self.week_col, {year=year, month=month, day=day})
+ end
+ if today == format_date(self.day_id, {day=day, month=month, year=year}) then
+ page = page .. " " .. self.today:format(day)
+ else
+ page = page .. " " .. self:day_style(column+1):format(self.anyday:format(day))
+ end
+ column = column + 1
+ end
+
+ for column = column, 6 do
+ page = page .. self.empty_sep
+ end
+
+ return page_title, self.html:format(page)
+end
+
+function calendar:switch(months)
+ self:show(self.year, self.month+months)
+end
+
+function calendar:show(year, month)
+ local today = os.time()
+ self.month = month or os.date('%m', today)
+ self.year = year or os.date('%Y', today)
+ local title, text = self:page(self.month, self.year)
+
+ -- NOTE: `naughty.replace_text` does not update bounds and can therefore
+ -- not be used when the size increases (before #1756 was merged):
+ local num_lines = select(2, text:gsub('\n', ''))
+ local will_fit = can_update_size or num_lines <= self.num_lines
+ if naughty.replace_text and self.notification and will_fit then
+ naughty.replace_text(self.notification, title, text)
+ else
+ self:hide()
+ self.notification = naughty.notify({
+ title = title,
+ text = text,
+ timeout = 0,
+ hover_timeout = 0.5,
+ screen = capi.mouse.screen,
+ position = self.position,
+ })
+ self.num_lines = num_lines
+ end
+end
+
+function calendar:hide()
+ if self.notification then
+ naughty.destroy(self.notification)
+ self.notification = nil
+ self.num_lines = 0
+ end
+end
+
+function calendar:attach(widget)
+ widget:connect_signal('mouse::enter', function() self:show() end)
+ widget:connect_signal('mouse::leave', function() self:hide() end)
+ widget:buttons(awful.util.table.join(
+ awful.button({ }, 1, function() self:switch( -1) end),
+ awful.button({ }, 3, function() self:switch( 1) end),
+ awful.button({ }, 4, function() self:switch( -1) end),
+ awful.button({ }, 5, function() self:switch( 1) end),
+ awful.button({ 'Shift' }, 1, function() self:switch(-12) end),
+ awful.button({ 'Shift' }, 3, function() self:switch( 12) end),
+ awful.button({ 'Shift' }, 4, function() self:switch(-12) end),
+ awful.button({ 'Shift' }, 5, function() self:switch( 12) end)
+ ))
+end
+
+return setmetatable(calendar, {
+ __call = calendar.new,
+})
diff --git a/calendar/init.lua b/calendar/init.lua
new file mode 120000
index 0000000..27082e6
--- /dev/null
+++ b/calendar/init.lua
@@ -0,0 +1 @@
+calendar.lua
\ No newline at end of file
diff --git a/calendar/screenshot.png b/calendar/screenshot.png
new file mode 100644
index 0000000..bac0c9d
Binary files /dev/null and b/calendar/screenshot.png differ