diff --git a/www/Dockerfile b/www/Dockerfile
index b912afc09f1458df1ff1d38e35dcb74895148b11..d430958c87c6a80ebc30885886a108fe7152d3c0 100644
--- a/www/Dockerfile
+++ b/www/Dockerfile
@@ -34,13 +34,13 @@ RUN rm /etc/nginx/sites-enabled/default
 
 RUN mkdir /opt/socket/
 
-COPY misc/ldapdb_base.py /usr/local/lib/python2.7/dist-packages/ldapdb/backends/ldap/base.py
+COPY misc/ldapdb_base.py /usr/local/lib/python3.4/dist-packages/ldapdb/backends/ldap/base.py
 COPY misc/entrypoint.sh /opt/entrypoint.sh
 
 ADD web /opt/warpinfra/
 ADD nginx /opt/nginx
 
-EXPOSE 8000
+EXPOSE 8000 443 80
 
 VOLUME ["/opt/nginx", "/opt/warpinfra"]
 
diff --git a/www/misc/entrypoint.sh b/www/misc/entrypoint.sh
index ac1f3e394c2e27a668417ef69e7753068c18d3af..36f0bbd6497771fea9f0b115ef805bd20302f2f4 100644
--- a/www/misc/entrypoint.sh
+++ b/www/misc/entrypoint.sh
@@ -5,7 +5,7 @@ cd /opt/warpinfra;
 python3 manage.py makemigrations
 python3 manage.py migrate
 python3 manage.py collectstatic --noinput
-
+cp -r /opt/warpinfra/static /opt/socket/
 uwsgi --ini /opt/nginx/uwsgi.ini --py-autoreload 1
 
 bash
diff --git a/www/nginx/nginx_warpinfra.conf b/www/nginx/nginx_warpinfra.conf
index 2c993bad8ca369190918e96049225883d1ab4376..33bccbdb8c5588ec727abf923dcb4e811ae9b20d 100644
--- a/www/nginx/nginx_warpinfra.conf
+++ b/www/nginx/nginx_warpinfra.conf
@@ -4,7 +4,22 @@ upstream django {
 
 server {
     listen      80;
-    return 301 https://$host$request_uri;
+    server_name _;
+    charset     utf-8;
+
+    client_max_body_size 100M;   # adjust to taste
+
+    location /static {
+        alias /opt/warpinfra/static; # your Django project's static files - amend as required
+    }
+
+    # Finally, send all non-media requests to the Django server.
+    location / {
+        uwsgi_pass  django;
+        include     /opt/nginx/uwsgi_params; # the uwsgi_params file you installed
+    }
+
+#    return 301 https://$host$request_uri;
 }
 
 # configuration of the server
diff --git a/www/nginx/warpinfra.crt b/www/nginx/warpinfra.crt
index 57cf97f9d112f676f20dcac1d198bff5f486afcf..f50c90dfdbc476caf4b97e67ca802d49cb6d46de 100644
--- a/www/nginx/warpinfra.crt
+++ b/www/nginx/warpinfra.crt
@@ -1,33 +1,87 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+s9A9vnnfhuMh
+7TJQQ+/pEAY2cQomr2zQqZbkcbZe+7vSf9BnXZbW9WBq932YQI5LT9aopkJrUgGM
+BdifjwXG5umIio4Jdp/HduBv7cg5S7aEABsFgNJ7eIRZsQ5J6Ho1ce1HhqcM8eEe
+W/IiKBUxfzBkugZ59wk7v6SMcpGNiDKEt9osHEPVKC+2sKII6dA72iLnZg3UeQHa
+2ixL4u92Dmvr3mq7Il4wGydvEMLXFYg1L20Qnvy3uOC0MpYG9iz6e5OK+FH4ytCE
+vBkOsyWZ5v+//ufThDlQPuIygPXuYUq+cZaIeYpXmVaGtf2gV0XQmvypna6EcsHp
+xnEP0tZNAgMBAAECggEAWfO1OTqcgAw/HOSmg+fXxUZyt8FQOXkrya0E6NKeZGU3
+bg4t/mPN3600gqAk1Ok2dV2+ciSiVb8DzcmAKZsr7WtEIszAPMSAj3SKXyF4/VWy
+TMdD96+RGP5651e11rTa2FTZyJBCQb/iIRDbwLLJdGR7Ljf1EBiveUhnVHxCHdCc
+/HOuGQnEJR1zOO8llTp36XN457ufqWWKSpS507gBmKdQiJDIooclaf71CIkJQBjh
+j04O74RlTpTFzHyg/vzn5VDllwokgAJ3g9PgunBmHqCTQCF5chkkBKaubtKa2hx0
+JsXuTS8Zf6TBRNlUXxPC4SwkuUMdRFIcCAlSF8jK3QKBgQDkbtfGC8PAoYTIO6pK
+tgRWSkdMkYG6UBoiLpH8qh7KDXT+CRcYdZNsDrH97VxaZlPUccL3Zrw68UVd50St
+Vfdke/BD0lkmzjACou4Ebwmp4ZupEE8RghKP7MoWlNLqzLs4T60UzQHMyNIUUxkT
+f6hWnuUBxasKkx4a+t2HWvXUrwKBgQDVt1SVcPcjr6VbFqs51LrzX4NU6d/b/il+
+uQS7QENzuCzVviGWAH59yQeVUSBB1xZweennIRnHhcpFYlqKA69VUwkyQb7uZZ4Y
+iRvlOAdbBE156LsUE0vU6rFDyCNGvhz5ClKt+nXWoJscl1kY3S5qyPGhkrwBFlQT
+594niKq7wwKBgQCt5Pt5lkckg1CzpUgTq9BNaCoyzan2DTh3wP/9WfwqUGg5Yu4j
+/o2FewJgjar6Xl9+oEONVrYAIN9vhrivQ3wbEIZs+tpHQjsmJqYO1gCDRG3dG781
+UtGSou2Mlyqg982mJnFaHl46aL4UHtY+E7YwirFG0hVM7YXDgCnX+pSdnQKBgGnj
+TrZIZTq6MSyDe8zIeORSg4iT5AVk1XxjAVQhkAoKy7QPYyamEgYSj35M1rWocwbB
+cMHCpbo0sLZV99P/5WRaIulSp94IXR9892RHsWVIKXbod6CHuv/AVJnn1IqdcU92
+7OYkfTQdGR0+Y7etBu2DqCzMvfev73J5ZJmj3ivvAoGBAIz13UZrQoj7SdOjUZkJ
+xGVjQKZbxJmEPCDXRoEjkPAmNCYiEtgMSD2xYuaSly1qyKwEwaevDzGBVO9Gf9QN
+9Lmb4E9OKVehGpdPYT2+MPKO4i0dXfD5w3CP7SXE6zhzInmX5+qEcdAqVemz8QI0
+b2XE2w6nht6kQcMj7MrdCphv
+-----END PRIVATE KEY-----
+
 -----BEGIN CERTIFICATE-----
-MIIFrTCCA5WgAwIBAgIJAKzK6RrFSz83MA0GCSqGSIb3DQEBCwUAMG0xCzAJBgNV
-BAYTAkRFMQwwCgYDVQQIDANOUlcxETAPBgNVBAcMCE11ZW5zdGVyMRIwEAYDVQQK
-DAlJVFNlY1RlYW0xEzARBgNVBAsMCkZsYWdIdW50ZXIxFDASBgNVBAMMC2ZsYWcu
-aHVudGVyMB4XDTE1MTEyMDE5MTQ1OVoXDTE2MTExOTE5MTQ1OVowbTELMAkGA1UE
-BhMCREUxDDAKBgNVBAgMA05SVzERMA8GA1UEBwwITXVlbnN0ZXIxEjAQBgNVBAoM
-CUlUU2VjVGVhbTETMBEGA1UECwwKRmxhZ0h1bnRlcjEUMBIGA1UEAwwLZmxhZy5o
-dW50ZXIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC7toPOwQ1Xcqwk
-VJItQC8wifoGeNk/E0k52XYVhvxXsZZI90n3CBp4LEIUMB6tPBwZ/mpI83hUu29f
-yWkD1iexWFQF5uJJr4IlAjKjznYuvi7EzbNAQsFTmOYRvmTSVvnONx1PpZFRGEt8
-d4AmeztCMtk9JCV45xPeh7T00mxq7okOFsfrIlKfi7q0N5X1neMK4hgOuRqR+TE3
-MJvcsCKzIi/g1hvrly48OZqhnoBeQZHxbuT2i+jyl56sBjHqRswFxxBOwifEBNsP
-V27Q9LWAi6tF1+RU6YYtfD4/en9sLEZ9y9U+Ch9kL82EaScIh234Sxb7VevAdJ3K
-b+sL3Vum3JaOwejhTbzMtl2JkTy7knR2PUFW4ZA85MvE6/IChFoYSHVM/rsbUESn
-nu08qAQ7AF2Yj/+sPCqc1BUEXxO6qYFeX+yXx4Fbl29xu3d5evbc2CHjVqGuGRyv
-2V7XkuUHhvLmYV8AVUFHp1yLxhEZsMl4eSoPjVnNmY/WoljJeNjC7XmHwllsvqJt
-59meh7FkD28DPducKnjfsKElqbc5pjeVi24302nHTS41eExalgHCd07j2sQVjXgF
-C3BUP2Jl+tU2QV5/jRH2GCLMkhEwP/lPdK5usS9jXhJo0sb56M1ak4ECfavrxHHh
-TSmgD9IaqP0ChOVIZ04DuxYxX2MURQIDAQABo1AwTjAdBgNVHQ4EFgQUC/Jkv7Vf
-f/VAeY8zrBqvyWe+L4cwHwYDVR0jBBgwFoAUC/Jkv7Vff/VAeY8zrBqvyWe+L4cw
-DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAeTtgmsIFI6LgxbyAIc/8
-dZXmP9DKXZkv17UEAKoJC/d+IOqDogXoeRhbo2cLmIXCE5cmhp+xsXZnxke4Oq39
-az6eBlcwaPUUTlzP5MiIqDpzbhi6sjQhp5FmH2/RtFkVzjpNm2NP+7IW1lAxx3is
-qxXBCVXYXmiHL6rW5BwNrlGDqwUhFDVZJL4QIBENqwMC7qTubYiukBdaqWz8uTYs
-WFOo73fYqG/SNbFifq78czTRoXTTr085Yxnprr4whuqTPpmBd42IUzOxRHF5ICPX
-316S6X3b65mTzzz15p1KquUe+VsULnUZTtOOeyIqpm8VWSu4EoKK0c2w8bZkgImR
-ttAMRnA4S00ZuhQ1CnJgMX/54krJWdswJH7O+fTsu7A7jy2PhADbyhPx61pVyH2H
-zYm+7RPlvGgdkqvdyO6EeZN1RRIPkyUb+6bbCwHPIDRc+DXh5dq4w0wN7vctMMri
-eo+OrxK97O4egmg67J3XCYBCmPsnH0vaV/UTOgmyeo7Y8NqMulUOCVz1PhidW0r2
-M7dRB7958G6Z1tuuFXr0Y+88RDyTHdu9XqCLHjLAjF2PIqhPHZ59KnHVmb4bWICK
-4D3rdOS0woeiXCxUQxekBh8ZMBIzyeUONrkYykBwV5sZrMZt26GGMlNyJ7uYcFzW
-MsRX8eO4RytlNdVSGVSrLpQ=
+MIIE/jCCA+agAwIBAgISA1hyjstoi3F5Iclnmu5EQMScMA0GCSqGSIb3DQEBCwUA
+MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
+ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNjA4MjgxNDI5MDBaFw0x
+NjExMjYxNDI5MDBaMBgxFjAUBgNVBAMTDWRldi5keWhvc3QuZGUwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+s9A9vnnfhuMh7TJQQ+/pEAY2cQomr2zQ
+qZbkcbZe+7vSf9BnXZbW9WBq932YQI5LT9aopkJrUgGMBdifjwXG5umIio4Jdp/H
+duBv7cg5S7aEABsFgNJ7eIRZsQ5J6Ho1ce1HhqcM8eEeW/IiKBUxfzBkugZ59wk7
+v6SMcpGNiDKEt9osHEPVKC+2sKII6dA72iLnZg3UeQHa2ixL4u92Dmvr3mq7Il4w
+GydvEMLXFYg1L20Qnvy3uOC0MpYG9iz6e5OK+FH4ytCEvBkOsyWZ5v+//ufThDlQ
+PuIygPXuYUq+cZaIeYpXmVaGtf2gV0XQmvypna6EcsHpxnEP0tZNAgMBAAGjggIO
+MIICCjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF
+BwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFHahdg/WaDq0yPz59/SZOwb9HmLX
+MB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMHAGCCsGAQUFBwEBBGQw
+YjAvBggrBgEFBQcwAYYjaHR0cDovL29jc3AuaW50LXgzLmxldHNlbmNyeXB0Lm9y
+Zy8wLwYIKwYBBQUHMAKGI2h0dHA6Ly9jZXJ0LmludC14My5sZXRzZW5jcnlwdC5v
+cmcvMBgGA1UdEQQRMA+CDWRldi5keWhvc3QuZGUwgf4GA1UdIASB9jCB8zAIBgZn
+gQwBAgEwgeYGCysGAQQBgt8TAQEBMIHWMCYGCCsGAQUFBwIBFhpodHRwOi8vY3Bz
+LmxldHNlbmNyeXB0Lm9yZzCBqwYIKwYBBQUHAgIwgZ4MgZtUaGlzIENlcnRpZmlj
+YXRlIG1heSBvbmx5IGJlIHJlbGllZCB1cG9uIGJ5IFJlbHlpbmcgUGFydGllcyBh
+bmQgb25seSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIENlcnRpZmljYXRlIFBvbGlj
+eSBmb3VuZCBhdCBodHRwczovL2xldHNlbmNyeXB0Lm9yZy9yZXBvc2l0b3J5LzAN
+BgkqhkiG9w0BAQsFAAOCAQEAl598A9BClTRIh84bzUTSSGu8nym9IOpl5and/gCX
+IsB1w66ZhJDcJC21mXkQWRSSysenwX0zayRaNs2KMZviyr32RTTfNPJHXFROYiNl
+G0iQodNvEhkF05/QEPS2DvFWqwU9nkxZ9byzzvciwFVHh1RqDzmGUqQTyu6pAqBt
+UZIjFulDL/zjLduIz9326hPGv/9qiEbumPpH7WTxUesaBrXXgrCSDkrXrVwk5V+b
+hGU5s/gEsrAxqQgFVqhrrnc8fK40kcqF45i5K2mrhFMSNtEuI7gwrKbs+vulZpJY
+TM2a4Gtibkew5XwpaC7aED6QLNux9jQdQ3lqsaSLj4Y9dQ==
 -----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/
+MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
+DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow
+SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT
+GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF
+q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8
+SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0
+Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA
+a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj
+/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T
+AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG
+CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv
+bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k
+c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw
+VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC
+ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz
+MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu
+Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF
+AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo
+uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/
+wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu
+X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG
+PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6
+KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==
+-----END CERTIFICATE-----
+
diff --git a/www/nginx/warpinfra.key b/www/nginx/warpinfra.key
index fb31d8d8b32b14632a7944541d778d7d3dac3a7a..f50c90dfdbc476caf4b97e67ca802d49cb6d46de 100644
--- a/www/nginx/warpinfra.key
+++ b/www/nginx/warpinfra.key
@@ -1,52 +1,87 @@
 -----BEGIN PRIVATE KEY-----
-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
-su7ZYG7K5L+RRjrWZagNh8X2s6qeaA==
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+s9A9vnnfhuMh
+7TJQQ+/pEAY2cQomr2zQqZbkcbZe+7vSf9BnXZbW9WBq932YQI5LT9aopkJrUgGM
+BdifjwXG5umIio4Jdp/HduBv7cg5S7aEABsFgNJ7eIRZsQ5J6Ho1ce1HhqcM8eEe
+W/IiKBUxfzBkugZ59wk7v6SMcpGNiDKEt9osHEPVKC+2sKII6dA72iLnZg3UeQHa
+2ixL4u92Dmvr3mq7Il4wGydvEMLXFYg1L20Qnvy3uOC0MpYG9iz6e5OK+FH4ytCE
+vBkOsyWZ5v+//ufThDlQPuIygPXuYUq+cZaIeYpXmVaGtf2gV0XQmvypna6EcsHp
+xnEP0tZNAgMBAAECggEAWfO1OTqcgAw/HOSmg+fXxUZyt8FQOXkrya0E6NKeZGU3
+bg4t/mPN3600gqAk1Ok2dV2+ciSiVb8DzcmAKZsr7WtEIszAPMSAj3SKXyF4/VWy
+TMdD96+RGP5651e11rTa2FTZyJBCQb/iIRDbwLLJdGR7Ljf1EBiveUhnVHxCHdCc
+/HOuGQnEJR1zOO8llTp36XN457ufqWWKSpS507gBmKdQiJDIooclaf71CIkJQBjh
+j04O74RlTpTFzHyg/vzn5VDllwokgAJ3g9PgunBmHqCTQCF5chkkBKaubtKa2hx0
+JsXuTS8Zf6TBRNlUXxPC4SwkuUMdRFIcCAlSF8jK3QKBgQDkbtfGC8PAoYTIO6pK
+tgRWSkdMkYG6UBoiLpH8qh7KDXT+CRcYdZNsDrH97VxaZlPUccL3Zrw68UVd50St
+Vfdke/BD0lkmzjACou4Ebwmp4ZupEE8RghKP7MoWlNLqzLs4T60UzQHMyNIUUxkT
+f6hWnuUBxasKkx4a+t2HWvXUrwKBgQDVt1SVcPcjr6VbFqs51LrzX4NU6d/b/il+
+uQS7QENzuCzVviGWAH59yQeVUSBB1xZweennIRnHhcpFYlqKA69VUwkyQb7uZZ4Y
+iRvlOAdbBE156LsUE0vU6rFDyCNGvhz5ClKt+nXWoJscl1kY3S5qyPGhkrwBFlQT
+594niKq7wwKBgQCt5Pt5lkckg1CzpUgTq9BNaCoyzan2DTh3wP/9WfwqUGg5Yu4j
+/o2FewJgjar6Xl9+oEONVrYAIN9vhrivQ3wbEIZs+tpHQjsmJqYO1gCDRG3dG781
+UtGSou2Mlyqg982mJnFaHl46aL4UHtY+E7YwirFG0hVM7YXDgCnX+pSdnQKBgGnj
+TrZIZTq6MSyDe8zIeORSg4iT5AVk1XxjAVQhkAoKy7QPYyamEgYSj35M1rWocwbB
+cMHCpbo0sLZV99P/5WRaIulSp94IXR9892RHsWVIKXbod6CHuv/AVJnn1IqdcU92
+7OYkfTQdGR0+Y7etBu2DqCzMvfev73J5ZJmj3ivvAoGBAIz13UZrQoj7SdOjUZkJ
+xGVjQKZbxJmEPCDXRoEjkPAmNCYiEtgMSD2xYuaSly1qyKwEwaevDzGBVO9Gf9QN
+9Lmb4E9OKVehGpdPYT2+MPKO4i0dXfD5w3CP7SXE6zhzInmX5+qEcdAqVemz8QI0
+b2XE2w6nht6kQcMj7MrdCphv
 -----END PRIVATE KEY-----
+
+-----BEGIN CERTIFICATE-----
+MIIE/jCCA+agAwIBAgISA1hyjstoi3F5Iclnmu5EQMScMA0GCSqGSIb3DQEBCwUA
+MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
+ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNjA4MjgxNDI5MDBaFw0x
+NjExMjYxNDI5MDBaMBgxFjAUBgNVBAMTDWRldi5keWhvc3QuZGUwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+s9A9vnnfhuMh7TJQQ+/pEAY2cQomr2zQ
+qZbkcbZe+7vSf9BnXZbW9WBq932YQI5LT9aopkJrUgGMBdifjwXG5umIio4Jdp/H
+duBv7cg5S7aEABsFgNJ7eIRZsQ5J6Ho1ce1HhqcM8eEeW/IiKBUxfzBkugZ59wk7
+v6SMcpGNiDKEt9osHEPVKC+2sKII6dA72iLnZg3UeQHa2ixL4u92Dmvr3mq7Il4w
+GydvEMLXFYg1L20Qnvy3uOC0MpYG9iz6e5OK+FH4ytCEvBkOsyWZ5v+//ufThDlQ
+PuIygPXuYUq+cZaIeYpXmVaGtf2gV0XQmvypna6EcsHpxnEP0tZNAgMBAAGjggIO
+MIICCjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF
+BwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFHahdg/WaDq0yPz59/SZOwb9HmLX
+MB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMHAGCCsGAQUFBwEBBGQw
+YjAvBggrBgEFBQcwAYYjaHR0cDovL29jc3AuaW50LXgzLmxldHNlbmNyeXB0Lm9y
+Zy8wLwYIKwYBBQUHMAKGI2h0dHA6Ly9jZXJ0LmludC14My5sZXRzZW5jcnlwdC5v
+cmcvMBgGA1UdEQQRMA+CDWRldi5keWhvc3QuZGUwgf4GA1UdIASB9jCB8zAIBgZn
+gQwBAgEwgeYGCysGAQQBgt8TAQEBMIHWMCYGCCsGAQUFBwIBFhpodHRwOi8vY3Bz
+LmxldHNlbmNyeXB0Lm9yZzCBqwYIKwYBBQUHAgIwgZ4MgZtUaGlzIENlcnRpZmlj
+YXRlIG1heSBvbmx5IGJlIHJlbGllZCB1cG9uIGJ5IFJlbHlpbmcgUGFydGllcyBh
+bmQgb25seSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIENlcnRpZmljYXRlIFBvbGlj
+eSBmb3VuZCBhdCBodHRwczovL2xldHNlbmNyeXB0Lm9yZy9yZXBvc2l0b3J5LzAN
+BgkqhkiG9w0BAQsFAAOCAQEAl598A9BClTRIh84bzUTSSGu8nym9IOpl5and/gCX
+IsB1w66ZhJDcJC21mXkQWRSSysenwX0zayRaNs2KMZviyr32RTTfNPJHXFROYiNl
+G0iQodNvEhkF05/QEPS2DvFWqwU9nkxZ9byzzvciwFVHh1RqDzmGUqQTyu6pAqBt
+UZIjFulDL/zjLduIz9326hPGv/9qiEbumPpH7WTxUesaBrXXgrCSDkrXrVwk5V+b
+hGU5s/gEsrAxqQgFVqhrrnc8fK40kcqF45i5K2mrhFMSNtEuI7gwrKbs+vulZpJY
+TM2a4Gtibkew5XwpaC7aED6QLNux9jQdQ3lqsaSLj4Y9dQ==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/
+MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
+DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow
+SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT
+GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF
+q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8
+SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0
+Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA
+a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj
+/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T
+AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG
+CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv
+bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k
+c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw
+VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC
+ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz
+MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu
+Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF
+AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo
+uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/
+wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu
+X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG
+PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6
+KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==
+-----END CERTIFICATE-----
+
diff --git a/www/run_dev.sh b/www/run_dev.sh
index b32520a3dfa64ca8dc4057e37215669091367597..476fcd0edce7187ab84fad522ff8c3494693c564 100644
--- a/www/run_dev.sh
+++ b/www/run_dev.sh
@@ -6,10 +6,10 @@ docker rm warpinfra
 
 docker run \
 	-v $SCRIPTPATH/web:/opt/warpinfra \
-        -v $SCRIPTPATH/nginx:/opt/nginx \
+    -v $SCRIPTPATH/nginx:/opt/nginx \
 	-v $SCRIPTPATH/conf/config.example.ini:/etc/warpinfra/config.ini \
 	--link ldap-service:ldap \
 	--name warpinfra \
-	-p 8000:443 \
+	-p 8000:80 \
 	-itd \
 	warpinfra
diff --git a/www/run_prod.sh b/www/run_prod.sh
index d9cb93821a4316ddd246bcba3acef5b0a0943013..ac4e6494ba835dd6126c060298c9327cb63252cd 100644
--- a/www/run_prod.sh
+++ b/www/run_prod.sh
@@ -9,6 +9,7 @@ docker run \
 	--link ldap-service:ldap \
 	--name warpinfra \
     --volume /tmp/warpinfra:/opt/socket \
+    --volume /opt/warpinfra/data:/opt/database/
 	-p 8000:443 \
 	-itd \
 	warpinfra
diff --git a/www/web/data/warpzone.db b/www/web/data/warpzone.db
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/www/web/warpauth/migrations/0001_initial.py b/www/web/warpauth/migrations/0001_initial.py
index d9bbae0a34e1467587059118a8f9f707b8d75d73..495e7e88c9b767398d2dbf2aa50e96881f0cff7e 100644
--- a/www/web/warpauth/migrations/0001_initial.py
+++ b/www/web/warpauth/migrations/0001_initial.py
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-# Generated by Django 1.9 on 2016-08-18 15:07
+# Generated by Django 1.9 on 2016-08-21 16:21
 from __future__ import unicode_literals
 
 from django.db import migrations, models
@@ -18,9 +18,9 @@ class Migration(migrations.Migration):
             name='LdapGroup',
             fields=[
                 ('dn', models.CharField(max_length=200)),
-                ('gid', ldapdb.models.fields.IntegerField(db_column=b'gidNumber', unique=True)),
-                ('name', ldapdb.models.fields.CharField(db_column=b'cn', max_length=200, primary_key=True, serialize=False)),
-                ('members', ldapdb.models.fields.ListField(db_column=b'memberUid')),
+                ('gid', ldapdb.models.fields.IntegerField(db_column='gidNumber', unique=True)),
+                ('name', ldapdb.models.fields.CharField(db_column='cn', max_length=200, primary_key=True, serialize=False)),
+                ('members', ldapdb.models.fields.ListField(db_column='memberUid')),
             ],
             options={
                 'abstract': False,
@@ -30,11 +30,11 @@ class Migration(migrations.Migration):
             name='LdapUser',
             fields=[
                 ('dn', models.CharField(max_length=200)),
-                ('uid', ldapdb.models.fields.CharField(db_column=b'uid', max_length=200, primary_key=True, serialize=False, unique=True)),
-                ('first_name', ldapdb.models.fields.CharField(db_column=b'givenName', max_length=200)),
-                ('last_name', ldapdb.models.fields.CharField(db_column=b'sn', max_length=200)),
-                ('email', ldapdb.models.fields.CharField(db_column=b'description', max_length=200)),
-                ('cn', ldapdb.models.fields.CharField(db_column=b'cn', max_length=200)),
+                ('uid', ldapdb.models.fields.CharField(db_column='uid', max_length=200, primary_key=True, serialize=False, unique=True)),
+                ('first_name', ldapdb.models.fields.CharField(db_column='givenName', max_length=200)),
+                ('last_name', ldapdb.models.fields.CharField(db_column='sn', max_length=200)),
+                ('email', ldapdb.models.fields.CharField(db_column='mail', max_length=200)),
+                ('cn', ldapdb.models.fields.CharField(db_column='cn', max_length=200)),
             ],
             options={
                 'abstract': False,
diff --git a/www/web/warpauth/migrations/0002_auto_20160821_1613.py b/www/web/warpauth/migrations/0002_auto_20160821_1613.py
new file mode 100644
index 0000000000000000000000000000000000000000..e83f51969682beb912c169d1b13d4a5f05374225
--- /dev/null
+++ b/www/web/warpauth/migrations/0002_auto_20160821_1613.py
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9 on 2016-08-21 16:13
+from __future__ import unicode_literals
+
+from django.db import migrations
+import ldapdb.models.fields
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('warpauth', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='ldapgroup',
+            name='gid',
+            field=ldapdb.models.fields.IntegerField(db_column='gidNumber', unique=True),
+        ),
+        migrations.AlterField(
+            model_name='ldapgroup',
+            name='members',
+            field=ldapdb.models.fields.ListField(db_column='memberUid'),
+        ),
+        migrations.AlterField(
+            model_name='ldapgroup',
+            name='name',
+            field=ldapdb.models.fields.CharField(db_column='cn', max_length=200, primary_key=True, serialize=False),
+        ),
+        migrations.AlterField(
+            model_name='ldapuser',
+            name='cn',
+            field=ldapdb.models.fields.CharField(db_column='cn', max_length=200),
+        ),
+        migrations.AlterField(
+            model_name='ldapuser',
+            name='email',
+            field=ldapdb.models.fields.CharField(db_column='mail', max_length=200),
+        ),
+        migrations.AlterField(
+            model_name='ldapuser',
+            name='first_name',
+            field=ldapdb.models.fields.CharField(db_column='givenName', max_length=200),
+        ),
+        migrations.AlterField(
+            model_name='ldapuser',
+            name='last_name',
+            field=ldapdb.models.fields.CharField(db_column='sn', max_length=200),
+        ),
+        migrations.AlterField(
+            model_name='ldapuser',
+            name='uid',
+            field=ldapdb.models.fields.CharField(db_column='uid', max_length=200, primary_key=True, serialize=False, unique=True),
+        ),
+    ]
diff --git a/www/web/warpauth/migrations/0002_ldapuser_card_id.py b/www/web/warpauth/migrations/0002_ldapuser_card_id.py
new file mode 100644
index 0000000000000000000000000000000000000000..95cb90cc8218d0e5ffb9e9f17c759e7d11d8cc12
--- /dev/null
+++ b/www/web/warpauth/migrations/0002_ldapuser_card_id.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9 on 2016-08-21 16:52
+from __future__ import unicode_literals
+
+from django.db import migrations
+import ldapdb.models.fields
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('warpauth', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='ldapuser',
+            name='card_id',
+            field=ldapdb.models.fields.CharField(db_column='pager', default=0, max_length=200),
+            preserve_default=False,
+        ),
+    ]
diff --git a/www/web/warpauth/models.py b/www/web/warpauth/models.py
index 3f4bae70c6a8e7ce4e788bda6ba9124b2bd280bb..e783a92a44ae6ad7fe34b64237a08011b93deb6e 100644
--- a/www/web/warpauth/models.py
+++ b/www/web/warpauth/models.py
@@ -22,7 +22,7 @@ class LdapUser(ldapdb.models.Model):
     last_name = CharField(db_column='sn', max_length=200)
     email = CharField(db_column='mail', max_length=200)
     cn = CharField(db_column='cn', max_length=200)
-
+    card_id = CharField(db_column='pager', max_length=200)
 
     def __str__(self):
         return self.uid
@@ -34,7 +34,7 @@ class LdapUser(ldapdb.models.Model):
 class LdapUserForm(ModelForm):
     class Meta:
         model = LdapUser
-        fields = ['first_name', 'last_name', 'email']
+        fields = ['first_name', 'last_name', 'email','card_id']
 
 
 class LdapGroup(ldapdb.models.Model):
diff --git a/www/web/warpfood/migrations/0001_initial.py b/www/web/warpfood/migrations/0001_initial.py
index b058e2f7c068bc20c7ee12d6c0e93f3900e57336..0a5a045d4448b76918dd0b16a2fd8cce3444790c 100644
--- a/www/web/warpfood/migrations/0001_initial.py
+++ b/www/web/warpfood/migrations/0001_initial.py
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-# Generated by Django 1.9 on 2016-08-18 15:07
+# Generated by Django 1.9 on 2016-08-21 16:20
 from __future__ import unicode_literals
 
 from django.db import migrations, models
diff --git a/www/web/warpmain/migrations/0001_initial.py b/www/web/warpmain/migrations/0001_initial.py
index e9f00807171a408da3714cb288d644f026c3f327..110b564820cc74d6549b156a474bed5089af4c5a 100644
--- a/www/web/warpmain/migrations/0001_initial.py
+++ b/www/web/warpmain/migrations/0001_initial.py
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-# Generated by Django 1.9 on 2016-08-18 15:07
+# Generated by Django 1.9 on 2016-08-21 16:27
 from __future__ import unicode_literals
 
 from django.db import migrations, models
diff --git a/www/web/warppay/admin.py b/www/web/warppay/admin.py
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..5f28e7452a7174e0e4d975ec1d5ca8ed9c177a12 100644
--- a/www/web/warppay/admin.py
+++ b/www/web/warppay/admin.py
@@ -0,0 +1,16 @@
+from django.contrib import admin
+from warppay.models import *
+
+# Register your models here.
+
+@admin.register(ProductCategory)
+class ProductCategoryAdmin(admin.ModelAdmin):
+        pass
+
+@admin.register(Product)
+class ProductAdmin(admin.ModelAdmin):
+        pass
+
+@admin.register(UserCredit)
+class UserCreditAdmin(admin.ModelAdmin):
+        pass
\ No newline at end of file
diff --git a/www/web/warppay/migrations/0001_initial.py b/www/web/warppay/migrations/0001_initial.py
index 8bb050b85990563e516ccb4f43774d3f199e1eba..03b54baa7b2f7cc01c3fb216f27601bfc8a5475f 100644
--- a/www/web/warppay/migrations/0001_initial.py
+++ b/www/web/warppay/migrations/0001_initial.py
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-# Generated by Django 1.9 on 2016-08-18 15:07
+# Generated by Django 1.9 on 2016-08-21 16:21
 from __future__ import unicode_literals
 
 from django.db import migrations, models
@@ -28,6 +28,7 @@ class Migration(migrations.Migration):
             fields=[
                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('uid', models.CharField(max_length=100, unique=True)),
+                ('card_id', models.IntegerField()),
                 ('credit', models.FloatField()),
             ],
         ),
diff --git a/www/web/warppay/migrations/0002_auto_20160821_1701.py b/www/web/warppay/migrations/0002_auto_20160821_1701.py
new file mode 100644
index 0000000000000000000000000000000000000000..e8d2e68b722d2bf46e643b14149635ad53b27315
--- /dev/null
+++ b/www/web/warppay/migrations/0002_auto_20160821_1701.py
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9 on 2016-08-21 17:01
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('warppay', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.RenameField(
+            model_name='product',
+            old_name='user',
+            new_name='name',
+        ),
+        migrations.RemoveField(
+            model_name='product',
+            name='created',
+        ),
+        migrations.RemoveField(
+            model_name='product',
+            name='message',
+        ),
+        migrations.RemoveField(
+            model_name='product',
+            name='title',
+        ),
+        migrations.AddField(
+            model_name='product',
+            name='count',
+            field=models.IntegerField(default=0),
+            preserve_default=False,
+        ),
+        migrations.AddField(
+            model_name='product',
+            name='price',
+            field=models.FloatField(default=0),
+            preserve_default=False,
+        ),
+    ]
diff --git a/www/web/warppay/migrations/0002_usercredit_card_id.py b/www/web/warppay/migrations/0002_usercredit_card_id.py
new file mode 100644
index 0000000000000000000000000000000000000000..bcb14cd56a798c23b31ae85cf23d0c2d29897a26
--- /dev/null
+++ b/www/web/warppay/migrations/0002_usercredit_card_id.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9 on 2016-08-21 16:12
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('warppay', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='usercredit',
+            name='card_id',
+            field=models.IntegerField(default=0),
+            preserve_default=False,
+        ),
+    ]
diff --git a/www/web/warppay/migrations/0003_auto_20160821_1706.py b/www/web/warppay/migrations/0003_auto_20160821_1706.py
new file mode 100644
index 0000000000000000000000000000000000000000..d834e1bcdff258bceb5092015858b996faceaf8c
--- /dev/null
+++ b/www/web/warppay/migrations/0003_auto_20160821_1706.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9 on 2016-08-21 17:06
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('warppay', '0002_auto_20160821_1701'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='ProductCategory',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=100, unique=True)),
+            ],
+        ),
+        migrations.AddField(
+            model_name='product',
+            name='category',
+            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='warppay.ProductCategory'),
+        ),
+    ]
diff --git a/www/web/warppay/migrations/0004_auto_20160909_1401.py b/www/web/warppay/migrations/0004_auto_20160909_1401.py
new file mode 100644
index 0000000000000000000000000000000000000000..4d8597b17a67bae6ce97b5df8b596e3ca65896bd
--- /dev/null
+++ b/www/web/warppay/migrations/0004_auto_20160909_1401.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9 on 2016-09-09 14:01
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('warppay', '0003_auto_20160821_1706'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='usercredit',
+            name='card_id',
+            field=models.CharField(max_length=10, unique=True),
+        ),
+    ]
diff --git a/www/web/warppay/models.py b/www/web/warppay/models.py
index c462cfa3f235f004d1f7cc471bc5d57967d06dcb..edda802f86a1919186034df70c72fcec50e02b2d 100644
--- a/www/web/warppay/models.py
+++ b/www/web/warppay/models.py
@@ -4,22 +4,35 @@ from django.db import models
 from rest_framework import routers, serializers, viewsets
 from warpauth.models import LdapUser
 
-
+class ProductCategory(models.Model):
+    name = models.CharField(max_length=100, unique=True)
+    def __str__(self):
+        return self.name
+        
 class Product(models.Model):
-    user = models.CharField(max_length=100, null=True)
-    title = models.CharField(max_length=100)
-    message = models.TextField()
-    created = models.DateTimeField(auto_now_add=True)
+    name = models.CharField(max_length=100, null=True)
+    price = models.FloatField()
+    category = models.ForeignKey(ProductCategory, on_delete=models.CASCADE, null=True)
+    count = models.IntegerField()
 
     def __str__(self):
-        return self.title
+        return self.name
+
+class ProductSerializer(serializers.ModelSerializer):
+    category = serializers.StringRelatedField()
+    class Meta:
+        model = Product
+        fields = ['id', 'name', 'price', 'category', 'count']
 
+        
 class UserCredit(models.Model):
     uid = models.CharField(max_length=100,unique=True)
+    card_id = models.CharField(max_length=10, unique=True)
     credit = models.FloatField()
+    def __str__(self):
+        return self.uid
 
-
-class UserCreditSerializer(serializers.HyperlinkedModelSerializer):
+class UserCreditSerializer(serializers.ModelSerializer):
     class Meta:
         model = UserCredit
-        fields = ['uid', 'credit']
+        fields = ['uid', 'card_id', 'credit']
diff --git a/www/web/warppay/urls.py b/www/web/warppay/urls.py
index 157ac62f86129fdc1da39e0ac86fb416f3a6d7e1..ac022ce57c617862cab5e9222e7829b9e99ca7ec 100644
--- a/www/web/warppay/urls.py
+++ b/www/web/warppay/urls.py
@@ -4,4 +4,8 @@ from warppay import views
 urlpatterns = [
     #url(r'^api/', include(router.urls)),
     url(r'^api/users/$', views.user_list),
+    url(r'^api/users/(?P<user_id>\w+)/$', views.user_list),
+    url(r'^api/products/$', views.product_list),
+    url(r'^api/gen_token/$', views.gen_token),
+
 ]
diff --git a/www/web/warppay/views.py b/www/web/warppay/views.py
index 42db93ab15af3a1db030dcff09e35f93516d3636..2cae82afd60116cf0fcd8b0e204d6636a8bd3293 100644
--- a/www/web/warppay/views.py
+++ b/www/web/warppay/views.py
@@ -1,41 +1,92 @@
 from django.db import IntegrityError
 from warpauth.models import LdapUser
-from warppay.models import UserCredit, UserCreditSerializer
+from warppay.models import UserCredit, UserCreditSerializer, Product, ProductSerializer
 from rest_framework.decorators import api_view
 from rest_framework.response import Response
 from rest_framework.authentication import TokenAuthentication
 from rest_framework.permissions import IsAuthenticated
 from rest_framework.decorators import authentication_classes, permission_classes
+from rest_framework.authtoken.models import Token
+from django.contrib.auth.models import User
+from rest_framework import status
 
-# from rest_framework.authtoken.models import Token
-# token = Token.objects.create(user=request.user)
 # logging.getLogger('main').info(token.key)
 
-@api_view(['GET', 'POST', 'PUT'])
-@authentication_classes((TokenAuthentication,))
-@permission_classes((IsAuthenticated,))
-def user_list(request):
+@api_view(['GET', 'PUT'])
+#@authentication_classes((TokenAuthentication,))
+#@permission_classes((IsAuthenticated,))
+def product_list(request):
     if request.method == 'GET':
-        sync_users()
-        users = UserCredit.objects.all()
-        serializer = UserCreditSerializer(users, many=True)
+        products = Product.objects.all()
+        serializer = ProductSerializer(products,context={'request': request}, many=True)
         return Response(serializer.data)
-    elif request.method == 'POST':
-
+    elif request.method == 'PUT':
         return Response()
+    return Response()
+
+
+@api_view(['GET'])
+def gen_token(request):
+    if request.method == 'GET': 
+        token = Token.objects.create(user=User.objects.get(username='api'))    
+        return Response(token)
+    return Response()
+
+@api_view(['GET', 'PUT', 'POST'])
+#@authentication_classes((TokenAuthentication,))
+#@permission_classes((IsAuthenticated,))
+def user_list(request, user_id = 0):
+    if request.method == 'GET':
+        sync_users()
+        if not user_id:
+            users = UserCredit.objects.all()
+            serializer = UserCreditSerializer(users, many=True)
+        else:
+            user = UserCredit.objects.get(uid=user_id)
+            serializer = UserCreditSerializer(user)
+        return Response(serializer.data)        
     elif request.method == 'PUT':
+        if not user_id:
+            return Response(status=status.HTTP_406_NOT_ACCEPTABLE)
+            
         sync_users()
         try:
-            UserCredit.objects.get(uid=request.data['uid'])
+            user = UserCredit.objects.get(uid=user_id)
+            if "credit" in request.data:
+                user.credit = request.data['credit']
+            if "card_id" in request.data:
+                user.card_id = request.data['card_id']
+            user.save();
+            return Response(UserCreditSerializer(user).data)
         except UserCredit.DoesNotExist:
-            u = UserCredit(uid=request.data['uid'], credit=0.0)
-            u.save()
+            return Response(status=status.HTTP_404_NOT_FOUND)
         return Response()
+        
+    elif request.method == 'POST':
+        card_id=""
+        if not 'uid' in request.data:
+            return Response(status=status.HTTP_406_NOT_ACCEPTABLE)
+        if 'card_id' in request.data:
+            card_id = request.data['card_id']
+        u = UserCredit(uid=request.data['uid'], card_id=card_id, credit=0.0)
+        try:
+            u.save()
+            state=status.HTTP_201_CREATED
+        except IntegrityError as e:
+            u = UserCredit.objects.get(uid=request.data['uid'])
+            state=status.HTTP_409_CONFLICT
+        
+        serializer = UserCreditSerializer(u)
+        return Response(serializer.data, status=state)
+    return Response()
+    
 
 def sync_users():
     for user in LdapUser.objects.all():
         try:
-            u = UserCredit(uid=user, credit=0.0)
+            u = UserCredit(uid=user.uid, card_id=user.card_id, credit=0.0)
             u.save()
         except IntegrityError:
             pass
+        except:
+            pass
diff --git a/www/web/warpzone.db b/www/web/warpzone.db
index 81069c749d4e6fcb5e38e98ea3925bf3623b89e0..2b253a2ff47ee5cbffbec87ac395208a4e2984fe 100644
Binary files a/www/web/warpzone.db and b/www/web/warpzone.db differ