diff --git a/2014/tentti/versiot_2014_kevat/Makefile b/2014/tentti/versiot_2014_kevat/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..ffa1300d5f713482ebaa9e47fea0a676a53268e7
--- /dev/null
+++ b/2014/tentti/versiot_2014_kevat/Makefile
@@ -0,0 +1,8 @@
+PREAMBLE='\usepackage[finnish]{babel} \usepackage[top=2in, bottom=1.5in, left=0.8in, right=0.8in]{geometry} '
+
+tentti_itka203_2014-05-21.pdf: tentti_itka203_2014-05-21.rst
+	rst2latex --latex-preamble=$(PREAMBLE) $< > tmp.tex
+	pdflatex tmp.tex
+	pdflatex tmp.tex
+	mv tmp.pdf $@
+
diff --git a/2014/tentti/versiot_2014_kevat/README.txt b/2014/tentti/versiot_2014_kevat/README.txt
new file mode 100644
index 0000000000000000000000000000000000000000..85ad9cdb1ff6ae10cbf2b9198ff8cd5f9c25b28d
--- /dev/null
+++ b/2014/tentti/versiot_2014_kevat/README.txt
@@ -0,0 +1,4 @@
+Varsinaiset tentit. Lisätään repositorioon kunkin tenttitilaisuuden
+alettua (+30 vähintään minuuttia, jonka jälkeen saleihin ei enää pääse
+myöhästyneitä tenttijöitä).
+
diff --git a/2014/tentti/versiot_2014_kevat/tentti_itka203_2014-05-21.rst b/2014/tentti/versiot_2014_kevat/tentti_itka203_2014-05-21.rst
new file mode 100644
index 0000000000000000000000000000000000000000..2e09d017b46f03ac99f56ffddebafa16250e2d82
--- /dev/null
+++ b/2014/tentti/versiot_2014_kevat/tentti_itka203_2014-05-21.rst
@@ -0,0 +1,231 @@
+.. raw:: latex
+
+  %make block paragraphs:
+  \parindent0pt  \parskip5pt
+
+
+##################################################
+ITKA203 -- Käyttöjärjestelmät -- Tentti 21.5.2014
+##################################################
+
+Kevään 2014 kurssi (luennot, demot 1-4 ja oheismateriaali) / Paavo
+Nieminen <paavo.j.nieminen@jyu.fi>.
+
+HUOM: Tarkastus jaetaan kolmen opettajan kesken. Palauta siksi **tasan
+kolme erillistä vastauspaperia** (ei siis yhtä eikä kahta), joissa
+jokaisessa on vähintään **nimesi**, **syntymäaikasi**, **kurssin
+tiedot** (koodi ja/tai nimi) sekä **vähintään tyhjä vastaus jokaista
+tehtävänumeroa kohden**. Jako on seuraava: Tehtävät 1, 2 ja 3 yhteen
+vastauspaperiin.  Tehtävät 4 ja 5 yhteen paperiin.  Tehtävä 6 yhteen
+paperiin.
+
+.. kertymä: laitteisto 0/4p  shell 0/8p  muu 0/12p
+
+**Kysymys 1/6 (vastauspaperille 1):**
+
+  Selitä, mitä seuraavat termit tarkoittavat tietokonelaitteiston ja
+  käyttöjärjestelmän yhteydessä:
+
+    a) osoiteavaruus 
+
+    b) ohjelmalaskuri
+
+    c) vuoronnus
+
+    d) pre-emptiivisyys
+
+    e) signaali
+
+(1+1+1+1+1=5p)
+
+.. kertymä: laitteisto 2/4p  shell 0/8p  muu 3/12p
+
+**Kysymys 2/6 (vastauspaperille 1):**
+
+  a) Listaa tietokoneessa käytettävät erityyppiset muistit
+     (ns. muistihierarkia) nopeasta hitaaseen.
+
+  b) Miksi tarvitaan näin monia erilaisia muisteja eikä
+     riitä vain yhdenlaiset?
+
+(1+1=2p)
+
+.. kertymä: laitteisto 4/4p  shell 0/8p  muu 3/12p
+
+**Kysymys 3/6: (vastauspaperille 1)**
+
+  Voit käsitellä luennoilla tai materiaalissa esitetyssä laajudessa,
+  oppikirjan esitteleminä konkreettisina esimerkkeinä, tai siinä
+  laajuudessa kuin käsittääksesi on välttämätöntä järkevän moniajon
+  toteutumiseksi:
+
+    a) Missä eri tiloissa prosessi voi olla?
+
+    b) Milloin tapahtuu mikäkin siirtymä tilojen välillä?
+
+(1+2 = 3p)
+
+.. kertymä: laitteisto 4/4p  shell 0/8p  muu 6/12p
+
+.. raw:: latex
+
+  \newpage
+
+
+**Kysymys 4/6 (vastauspaperille 2):**
+
+  a) Selitä poissulkuongelma: millaisissa tilanteissa se voi tulla
+     eteen, ja mitä se esimerkiksi voi käsittelemättömänä aiheuttaa.
+
+  b) Esitä C-ohjelma tai pseudokoodi, jossa poissulku tehdään käyttäen
+     käyttöjärjestelmän semaforipalveluita.
+
+  c) Anna esimerkki tilanteesta, jossa voi tapahtua lukkiutuminen eli
+     deadlock -tilanne.
+
+(3p)
+
+.. kertymä: laitteisto 4/4p  shell 0/8p  muu 9/12p
+
+**Kysymys 5/6 (vastauspaperille 2):**
+
+  Merkin lukeminen päätteeltä on esimerkki I/O -operaatiosta. Kerro,
+  miten luku tapahtuu: mitkä kaikki ohjelmisto- ja laitteisto-osat
+  osallistuvat sen toteuttamiseen missäkin vaiheessa, ja mitä niiden
+  kunkin vastuulla on?  Aloita kertomus hetkestä, jolloin käyttäjän
+  ohjelma tekee operaatiopyynnön, ja lopeta siihen, kun operaatio on
+  valmis ja I/O:ta pyytänyt käyttäjän ohjelma jatkuu taas seuraavasta
+  käskystä. (Tyyli vapaa - kaaviot, pseudokoodit, essee käyvät).
+
+(3p)
+
+.. kertymä: laitteisto 4/4p  shell 0/8p  muu 12/12p
+
+.. raw:: latex
+
+  \newpage
+
+
+**Kysymys 6/6 (vastauspaperille 3):**
+
+  a) Mitä tekee tyypillinen unix-apuohjelma ``grep``?
+
+  b) Mitä tekee tyypillinen unix-apuohjelma ``kill``?
+
+  c) Mitä seuraava skripti tekee (hipsukat ovat "backtick"-merkkejä)::
+
+       #!/bin/sh
+       echo `$0`
+
+  d) Mikä on lopputulema edellisen kohdan skriptin ajamisesta?
+
+  e) Seuraavan skriptin haluttaisiin toimivan kommenttien mukaisesti,
+     mutta kaikkea ei ole vielä toteutettu (TODO-merkinnät) ja lisäksi
+     tekijälle on tullut joitakin karkeita virheitä
+     tähänastisessa. Kirjoita skripti uudelleen niin, että se toimii
+     kommenteissa ilmoitetuin tavoin. (Kommentteja ei tarvitse toistaa
+     vastauksessa vaan ainoastaan skripti niin että se toimii
+     virheettömästi.)
+
+Puolivalmis skripti nimeltä ``skripti.sh``::
+
+       #!/bin/sh
+       # Prosessinhallinnan tilanteen tallentava skripti. Käyttöesimerkki:
+       #     skripti.sh logitiedot.txt
+
+       # Em. komento tallentaa 'logitiedot.txt' -nimiseen tiedostoon 
+       # kellonajan ja suorituksessa olevat prosessit. 
+       # Tiedosto ei saa olla ennestään olemassa.
+
+       # TODO: Pitäisi varmistaa, että käyttäjä on antanut tasan yhden
+       # argumentin ja lopettaa tähän, jos näin ei ole..
+
+       fname=$1
+
+       # TODO: Pitäisi tarkistaa, että tiedostoa ei vielä ole 
+       # olemassa; jos on jo olemassa niin pitäisi lopettaa kesken
+       # (ettei vahingossa ylikirjoiteta käyttäjän aiempaa dataa)
+
+       # Laitetaan tiedoston ensimmäiselle riville otsikoksi 
+       # tämänhetkinen kellonaika ja suorittajan käyttäjätunnus:
+
+       echo Käyttäjä whoami ajoi tämän hetkellä date > fname
+
+       # TODO: Pitäisi tarkistaa, että tiedosto on nyt syntynyt
+       # ja siihen voi kirjoittaa. Muuten pitäisi 
+       # antaa käyttäjälle virheilmoitus ja lopettaa kesken.
+
+       # Jatketaan tiedostoa kirjoittamalla otsikon perään kaikki
+       # tällä hetkellä järjestelmässä suorituksessa olevat ohjelmat:
+       ps -ef > $fname
+
+(1+1+1+1+4 = 8p)
+
+.. kertymä: laitteisto 4/4p  shell 8/8p  muu 12/12p
+
+.. raw:: latex
+
+  \newpage
+
+Liite: Yhden sivun sh-luntti
+=============================
+
+.. raw:: latex
+
+  {\small
+
+::
+
+  Joitakin ohjelmointirakenteita:
+      muuttuja=57               # tarkka syntaksista: ei välilyöntejä!
+      muuttuja="eki"; muuttuja="$muuttuja$muuttuja"
+      read muuttuja             # lukee muuttujaan syöttövirrasta
+
+      if EHTO                   # Myös:  if EHTO; then ...; \
+      then                      #        elif EHTO; then ...; fi
+        ...                     #
+      fi                        #
+
+      for muuttuja in LISTA     # muttujan "esittelyssä"/asetuksessa ei $
+      do
+        ... jotakin $muuttuja jotakin ... # muuttujan käytössä $muuttuja
+      done
+
+      while EHTO; do ... ; ... ; done     # käskyerotin rivinvaihto tai ;
+
+      # Tee jotain syötteen kaikille riveille:
+      while read rivi; do echo "luin: $rivi" ; done < rivit.txt
+
+      case $hanen_nimensa in
+        kirsimarja)
+            echo "Hei Kippe" ;;
+        eskomatias)
+            echo "Moi E.M." ;;
+      esac
+
+      Aliohjelmat mahdollisia&hyödyllisiä, mutta ei käsitellä ITKA203:lla.
+
+  Joidenkin ehtojen käyttöä (Välilyönnit merkityksellisiä!):
+      [[ -d TIEDOSTONIMI ]]      # tosi, jos on hakemisto
+      [[ -f TIEDOSTONIMI ]]      # tosi, jos on tavallinen tiedosto
+      [[ -w TIEDOSTONIMI ]]      # tosi, jos on olemassa ja kirjoitettavissa
+      [[ ! -f TIEDOSTONIMI ]]    # tosi, jos ei olemassa tai ei tavallinen
+      [[ "$muuttuja" -le "57" ]] # tosi, jos muuttuja <= 57 (myös lt,gt,ge)
+
+  Argumenttien käyttö:   (yli 9 arg mahd., mutta ei käsitellä ITKA203:lla)
+      echo "Tämän skriptin nimi on $0. Eka argumentti $1, neljäs $4"
+      echo "Argumenttien määrä on $#"
+
+  Joitakin sisäänrakennettuja toimintoja:
+      exit VIRHEKOODI              # koodi 0 tarkoittaa onnistumista
+      cd                           # vaihtaa skriptin työhakemistoa
+      echo                         # kaiuttaa tekstiä
+      let muuttuja=$muuttuja+3     # (perusaritmetiikkaa)
+
+  Erikoismerkkejä (tuttuja interaktiivisesta käytöstä; toimii skripteissä):
+      <   >   >>   |   `KOMENTO`
+
+
+.. raw:: latex
+
+  } %footnotesize