diff --git a/8. labor/SwingMvcLab/.gitignore b/8. labor/SwingMvcLab/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..82276168c1c8eb35b95cf81eb35caea497dca719
--- /dev/null
+++ b/8. labor/SwingMvcLab/.gitignore	
@@ -0,0 +1 @@
+students.dat
diff --git a/8. labor/SwingMvcLab/.students.dat b/8. labor/SwingMvcLab/.students.dat
new file mode 100644
index 0000000000000000000000000000000000000000..05be3d7be4949718cc54c69762916c02b2054285
Binary files /dev/null and b/8. labor/SwingMvcLab/.students.dat differ
diff --git a/8. labor/SwingMvcLab/src/swingmvclab/Student.java b/8. labor/SwingMvcLab/src/swingmvclab/Student.java
new file mode 100644
index 0000000000000000000000000000000000000000..a2e81985e384238ea3cb43ca18211b9ebc066071
--- /dev/null
+++ b/8. labor/SwingMvcLab/src/swingmvclab/Student.java	
@@ -0,0 +1,72 @@
+package swingmvclab;
+
+import java.io.Serializable;
+
+/*
+ * Egy hallgató adatait tároló osztály.
+ * 
+ * NE MÓDOSÍTSD!
+ */
+public class Student implements Serializable {
+
+    // Hallgató neve
+    private String name;
+
+    // Hallgató Neptun-kódja.
+    private String neptun;
+
+    // Van-e aláírása.
+    private boolean signature;
+
+    // A megszerzett osztályzat.
+    private int grade;
+
+    // Hallgató nevének lekérdezése. 
+    public String getName() {
+        return name;
+    }
+    
+    // Hallgató nevének beállítása.
+    public void setName(String name) {
+        this.name = name;
+    }
+    
+    // Hallgató Neptun-kódjának lekérdezése.
+    public String getNeptun() {
+        return neptun;
+    }
+    
+    // Hallgató Neptun-kódjának beállítása.
+    public void setNeptun(String neptun) {
+        this.neptun = neptun;
+    }
+    
+    // Aláírás meglétének lekérdezése.
+    public Boolean hasSignature() {
+        return signature;
+    }
+    
+    // Aláírás meglétének beállítása.
+    public void setSignature(Boolean signature) {
+        this.signature = signature;
+    }
+
+    // Osztályzat lekérdezése.
+    public Integer getGrade() {
+        return grade;
+    }
+    
+    // Osztályzat beállítása.
+    public void setGrade(Integer grade) {
+        this.grade = grade;
+    }
+
+    // Hallgató létrehozása
+    public Student(String name, String neptun, Boolean signature, Integer grade) {
+        this.name = name;
+        this.neptun = neptun;
+        this.signature = signature;
+        this.grade = grade;
+    }
+    
+}
diff --git a/8. labor/SwingMvcLab/src/swingmvclab/StudentData.java b/8. labor/SwingMvcLab/src/swingmvclab/StudentData.java
new file mode 100644
index 0000000000000000000000000000000000000000..235f7d529c1d6a757ea0e102586e6b64d71c467f
--- /dev/null
+++ b/8. labor/SwingMvcLab/src/swingmvclab/StudentData.java	
@@ -0,0 +1,101 @@
+package swingmvclab;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.event.TableModelListener;
+import javax.swing.table.AbstractTableModel;
+
+/*
+ * A hallgatók adatait tároló osztály.
+ */
+public class StudentData extends AbstractTableModel{
+
+    /*
+     * Ez a tagváltozó tárolja a hallgatói adatokat.
+     * NE MÓDOSÍTSD!
+     */
+    List<Student> students = new ArrayList<>();
+
+	@Override
+	public int getRowCount() {
+		return students.size();
+	}
+
+	@Override
+	public int getColumnCount() {
+		return 4;
+	}
+
+	@Override
+	public Object getValueAt(int i, int i1) {
+		Student student = students.get(i);
+		switch(i1) {
+			case 0: return student.getName();
+			case 1: return student.getNeptun();
+			case 2: return student.hasSignature();
+			default: return student.getGrade();
+		}
+	}
+
+	@Override
+	public void addTableModelListener(TableModelListener tl) {
+		super.addTableModelListener(tl); //To change body of generated methods, choose Tools | Templates.
+	}
+	
+	@Override
+	public String getColumnName(int i)
+	{
+		switch(i)
+		{
+			case 0: return "Név";
+			case 1: return "Neptun";
+			case 2: return "Aláírás";
+			default: return "Jegy";
+		}
+	}
+    
+	@Override
+	public Class<?> getColumnClass(int i)
+	{
+		Student s=students.get(0);
+		switch(i)
+		{
+			case 0: return String.class;
+			case 1: return String.class;
+			case 2: return Boolean.class;
+			default: return Integer.class;
+		}
+	}
+
+	@Override
+	public boolean isCellEditable(int i, int i1)
+	{
+		boolean[] b={false,false,true,true};
+		return (i1<getColumnCount() && i1>=0)?b[i1]:false;
+	}
+	
+	@Override
+	public void setValueAt(Object o, int i, int i1)
+	{
+		Student s=students.get(i);
+		if(i1>=2 && i1<=3)
+		{
+			switch(i1)
+			{	
+				case 2:
+					s.setSignature((Boolean)o);
+					break;
+				default: 
+					s.setGrade((Integer)o);
+					break;
+			}
+			students.set(i, s);
+		}
+	}
+
+	public void addStudent(String name, String neptun)
+	{
+		students.add(new Student(name, neptun, Boolean.FALSE, 0));
+		this.fireTableDataChanged();
+	}
+}
diff --git a/8. labor/SwingMvcLab/src/swingmvclab/StudentFrame.java b/8. labor/SwingMvcLab/src/swingmvclab/StudentFrame.java
new file mode 100644
index 0000000000000000000000000000000000000000..142912ceab55d166b41a94c5c24a45c2b2025fec
--- /dev/null
+++ b/8. labor/SwingMvcLab/src/swingmvclab/StudentFrame.java	
@@ -0,0 +1,118 @@
+package swingmvclab;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.List;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.JTextField;
+
+/*
+ * A megjelenítendõ ablakunk osztálya.
+ */
+public class StudentFrame extends JFrame {
+    
+    /*
+     * Ebben az objektumban vannak a hallgatói adatok.
+     * A program indulás után betölti az adatokat fájlból, bezáráskor pedig kimenti oda.
+     * 
+     * NE MÓDOSÍTSD!
+     */
+    private StudentData data;
+	private JTextField newName;
+    private JTextField newNeptun;
+    /*
+     * Itt hozzuk létre és adjuk hozzá az ablakunkhoz a különbözõ komponenseket
+     * (táblázat, beviteli mezõ, gomb).
+     */
+    private void initComponents() {
+        this.setLayout(new BorderLayout());
+		//táblázat
+		JTable jt=new JTable(data);
+		jt.setFillsViewportHeight(rootPaneCheckingEnabled);
+        this.add(new JScrollPane(jt),BorderLayout.CENTER);
+		
+		//hozzáadó sor
+		JPanel adderPanel=new JPanel(new FlowLayout());
+		adderPanel.add(new JLabel("Név:"));
+		newName = (JTextField)adderPanel.add(new JTextField(15)); //csak azért, mert így is lehet :)
+		
+		adderPanel.add(new JLabel("Neptun:"));
+		newNeptun = (JTextField)adderPanel.add(new JTextField(6));
+		
+		JButton adderButton = (JButton) adderPanel.add(new JButton("Felvesz"));
+		adderButton.addActionListener(new ActionListener() {
+				@Override
+				public void actionPerformed(ActionEvent ae) 
+				{
+					data.addStudent(newName.getText(), newNeptun.getText());
+					jt.updateUI();
+				}
+			});
+		this.add(adderPanel,BorderLayout.SOUTH);
+    }
+
+    /*
+     * Az ablak konstruktora.
+     * 
+     * NE MÓDOSÍTSD!
+     */
+    @SuppressWarnings("unchecked")
+    public StudentFrame() {
+        super("Hallgatói nyilvántartás");
+        setDefaultCloseOperation(EXIT_ON_CLOSE);
+        
+        // Induláskor betöltjük az adatokat
+        try {
+            data = new StudentData();
+            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("students.dat"));
+            data.students = (List<Student>)ois.readObject();
+            ois.close();
+        } catch(Exception ex) {
+            ex.printStackTrace();
+        }
+        
+        // Bezáráskor mentjük az adatokat
+        addWindowListener(new WindowAdapter() {
+				@Override
+				public void windowClosing(WindowEvent e) {
+					try {
+						ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("students.dat"));
+						oos.writeObject(data.students);
+						oos.close();
+					} catch(Exception ex) {
+						ex.printStackTrace();
+					}
+				}
+			});
+
+        // Felépítjük az ablakot
+        setMinimumSize(new Dimension(500, 200));
+        initComponents();
+    }
+
+    /*
+     * A program belépési pontja.
+     * 
+     * NE MÓDOSÍTSD!
+     */
+    public static void main(String[] args) {
+        // Megjelenítjük az ablakot
+        StudentFrame sf = new StudentFrame();
+        sf.setVisible(true);
+    }
+}
diff --git a/8. labor/java_8_swing_mvc_tasks.pdf b/8. labor/java_8_swing_mvc_tasks.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..14f0a881bff2062498c93dbeb6271aa35fefc4e2
Binary files /dev/null and b/8. labor/java_8_swing_mvc_tasks.pdf differ