diff --git a/i3/config b/i3/config
index 24292c5a310f4c7f674cad3ee586ac2a8ca8f465..76036a25b00cdbe7d7de500dbb0bcb4dda142d09 100644
--- a/i3/config
+++ b/i3/config
@@ -204,7 +204,7 @@ bindsym $mod+r mode "resize"
 # Start i3bar to display a workspace bar (plus the system information i3status
 # finds out, if available)
 bar {
-        status_command "~/.config/i3/status.out"
+        status_command "~/.config/i3/status.out 2>~/.status.log"
 }
 
 exec --no-startup-id synclient HorizEdgeScroll=1 VertEdgeScroll=1 VertScrollDelta=-111
@@ -333,6 +333,8 @@ mode "System modifikator"
 	bindsym bracketright exec "notify-send \\"$(lsblk)\\""
 	bindsym Shift+bracketright mode "default"; exec "gksudo -g gparted"
 	bindsym Ctrl+bracketright mode "default"; exec "gksudo -g gnome-disks"
+
+	bindcode 94 exec --no-startup-id "osdd-run & sleep 0.1;osdc --color=red RESTART"
 }
  
 bindcode 121 exec "echo $(( 1 - $(cat ~/.config/micloop/mute) )) > ~/.config/micloop/mute;pacmd set-sink-input-mute $(cat ~/.config/micloop/id) $(cat ~/.config/micloop/mute) ; notify-send 'loopmic mute' $(cat ~/.config/micloop/mute) -h string:x-canonical-private-synchronous:anything"
@@ -377,4 +379,10 @@ bindsym $mod+Shift+o exec --no-startup-id killall -3 mate-session; exec --no-sta
 
 exec "setxkbmap us,cz -variant ,ucw -option grp:caps_switch"
 
-exec "osdd-run"
+exec "osd-run"
+
+bindcode 94 exec "osdc --duration=1 \\"\\""
+bindcode Shift+94 exec "osdc --skip=1 --log=0 --duration=1 \\"\\""
+bindcode Ctrl+94 exec "osd-clock"
+bindcode Ctrl+Shift+94 exec "terminal -e bash -i -c \\"cat ~/.osdd_log;read\\""
+bindcode $mod+94 exec "terminal"
diff --git a/i3/i3status.conf b/i3/i3status.conf
new file mode 100644
index 0000000000000000000000000000000000000000..67073ec001be9ce0662160c0803f3bc0ef1384f4
--- /dev/null
+++ b/i3/i3status.conf
@@ -0,0 +1,52 @@
+# i3status configuration file.
+# see "man i3status" for documentation.
+
+# It is important that this file is edited as UTF-8.
+# The following line should contain a sharp s:
+# ß
+# If the above line is not correctly displayed, fix your editor first!
+
+general {
+	output_format = "i3bar"
+        colors = true
+        interval = 1
+}
+
+order += "wireless _first_"
+order += "ethernet _first_"
+order += "battery all"
+order += "load"
+order += "memory"
+order += "tztime local"
+
+wireless _first_ {
+        format_up = "W: (%quality at %essid) %ip"
+        format_down = "W: down"
+}
+
+ethernet _first_ {
+        format_up = "E: %ip (%speed)"
+        format_down = "E: down"
+}
+
+battery all {
+        format = "%status %percentage %remaining"
+}
+
+disk "/" {
+        format = "%avail"
+}
+
+load {
+        format = "%1min L"
+}
+
+memory {
+        format = "%used X %available"
+        threshold_degraded = "1G"
+        format_degraded = "MEMORY < %available"
+}
+
+tztime local {
+        format = "%Y-%m-%d %H:%M:%S"
+}
diff --git a/i3/init.sh b/i3/init.sh
index 78e10c8c6e85d96f5d91f3284fe6e65a2cd5e4e2..9ab41e59c89386fd22ed4c65f2168d66c0381d09 100755
--- a/i3/init.sh
+++ b/i3/init.sh
@@ -5,7 +5,9 @@ mkdir -p ~/.config/i3
 ln -sr config ~/.config/i3/config 
 ln -sr toggle-border ~/.config/i3/i3-toggle-border
 ln -sr kill ~/.config/i3/i3-kill
+ln -sr i3status.conf ~/.config/i3/
 chmod o+x ~/.config/i3/i3-*
+g++ status.cpp -o ~/.config/i3/status.out
 
 if [ "$1" == "mint" ];
 then
diff --git a/i3/status.cpp b/i3/status.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..4c0c77c64956b80e41e3f2687cbcc0d52f8ebce9
--- /dev/null
+++ b/i3/status.cpp
@@ -0,0 +1,100 @@
+#include<bits/stdc++.h>
+#include<unistd.h>
+using namespace std;
+#ifdef DEB
+#define D if(1)
+#else
+#define D if(0)
+#endif
+
+#define fo(a,b) for(int a=0;a<(b);++a)
+using ll = long long;
+
+const int LEN = 5000;
+ll t;
+
+#define TIME_P "%lld%s"
+#define TIME(a) ((a)<180?a:(a)/60<180?a/60:a/60/60),((a)<180?"s":(a)/60<180?"min":"h")
+
+#define ERR(a,b) {sprintf(out,"{\"name\":\"error\",\"color\":\"#FF0000\",\"full_text\":\"%s\"}" b,a);return;}
+void loadOsdd(char * out)
+{
+	*out=0;
+	static char color[LEN],line[LEN];
+	FILE * f = fopen(".osdd_last","r");
+	if(!f) ERR("Open f",",");
+	ll ti;
+	fscanf(f,"%lld",&ti);
+	ti = t-ti;
+	for(int i=0;fscanf(f," %s%[^\n]",color,line)==2;i++)
+	{
+		if(line[1]) 
+		{
+			out+=sprintf(out,"{\"name\":\"osdd%d\",\"color\":\"#%s\",\"full_text\":\"",i,color);
+			if(!i) 
+				out+=sprintf(out,"[" TIME_P "] ",TIME(ti));
+			out+=sprintf(out,"%s\"},",line+1);
+		}
+		
+	}
+	fclose(f);
+}
+void loadMail(char * out)
+{
+	out[0]=0;
+	FILE * f = fopen(".cm","r");
+	if(!f) ERR("Open f",);
+	ll lastUpTime=0;
+	int newMails=0;
+	if(fscanf(f,"%lld%d",&lastUpTime,&newMails)!=2) return;
+	ll delay = t-lastUpTime;
+	if(-5 < delay && delay > 30)
+		if(newMails)
+			sprintf(out,"{\"name\":\"mail\",\"color\":\"#%s\",\"full_text\":\"NO CONNECTION " TIME_P " [%d]\"}",t%2?"FF0000":"3333FF",TIME(delay),newMails);
+		else
+			sprintf(out,"{\"name\":\"mail\",\"color\":\"#FF0000\",\"full_text\":\"NO CONNECTION " TIME_P "\"}",TIME(delay));
+	else 
+		if(newMails)
+			sprintf(out,"{\"name\":\"mail\",\"color\":\"#%s\",\"full_text\":\"[%d NEW]\"}",t%2?"FF7000":"3333FF",newMails);
+		else
+			sprintf(out,"{\"name\":\"mail\",\"color\":\"#00FF00\",\"full_text\":\"OK\"}");
+	fclose(f);
+
+}
+char i3status_aloc[LEN];
+char mail[LEN];
+char osdd[LEN];
+
+int main()
+{
+	assert(chdir(getenv("HOME"))==0);
+	FILE * f = popen("i3status -c ~/.config/i3/i3status.conf","r");
+	char * i3status;
+	while(fgets(i3status=i3status_aloc,LEN-2,f))
+	{
+		{
+			ll lastt = t;
+			t=time(0);
+			if(t==lastt) t++;
+
+		}
+		if(!memcmp(i3status,"{\"ver",sizeof("{\"ver")-1)||!strcmp(i3status,"[\n")||!strcmp(i3status,"]\n"))
+		{
+			printf("%s",i3status);
+			fprintf(stderr,"%s",i3status);
+		}
+		else
+		{
+			if(i3status[0]==',') {putc(*i3status,stderr);putchar(i3status++[0]);}
+			if(i3status[0]=='[') {putc(*i3status,stderr);putchar(i3status++[0]);}
+			loadMail(mail);
+			loadOsdd(osdd);
+			printf("%s%s,%s",osdd,mail,i3status);
+			fprintf(stderr,"%s%s,%s",osdd,mail,i3status);
+		}
+		fflush(stdout);
+		fflush(stderr);
+	}
+	return 0;
+}
+