diff --git a/plab/javadoc.go b/plab/javadoc.go
index d1e9a596ee122426d5bc59487b8337aae53cbe0e..10dfea5f312cbe8697a7b654cf37f7db2c2fe03f 100644
--- a/plab/javadoc.go
+++ b/plab/javadoc.go
@@ -94,11 +94,54 @@ func (c *Class) getMethod(name string) *Method {
 	return nil
 }
 
+func (i *InternalType) changed() bool {
+	for _, a := range i.Annotations {
+		if a.changed() {
+			return true
+		}
+	}
+	return false
+}
+
+func (a *Annot) changed() bool {
+	if a.TypeName == "Docs" {
+		for _, e := range a.Elements {
+			switch e.QualifiedName {
+			case "projlab.Docs.changed":
+				if e.Value == "true" {
+					return true
+				}
+			}
+		}
+	}
+	return false
+}
+
+func (c *Class) changedClass() bool {
+	if c.changed() {
+		return true
+	}
+
+	for _, m := range c.Methods {
+		if m.changed() {
+			return true
+		}
+	}
+
+	for _, f := range c.Fields {
+		if f.changed() {
+			return true
+		}
+	}
+
+	return false
+}
+
 var Javadoc = helpers.Subcommand{
 	Name: "javadoc",
 	Command: func(args []string) {
-		if len(args) > 1 {
-			fmt.Println("usage: javadoc [source location]")
+		if len(args) > 2 {
+			fmt.Println("usage: javadoc [source location] [-changed]")
 			return
 		}
 
@@ -117,7 +160,15 @@ var Javadoc = helpers.Subcommand{
 		classes = linkInheritance(classes)
 		classes = resolveDocsFromInheritance(classes)
 
-		printLatex(classes)
+		changed := false
+		for _, a := range args {
+			if a == "-changed" {
+				changed = true
+				break
+			}
+		}
+
+		printLatex(classes, changed)
 	},
 	Help: "create and parse javadoc from code",
 }
@@ -347,7 +398,7 @@ func resolveDocsFromInheritance(c map[string]*Class) map[string]*Class {
 	return c
 }
 
-func printLatex(c map[string]*Class) {
+func printLatex(c map[string]*Class, changed bool) {
 	keys := make([]string, 0, len(c))
 	for k := range c {
 		keys = append(keys, k)
@@ -359,91 +410,121 @@ func printLatex(c map[string]*Class) {
 
 	for _, k := range keys {
 		class := c[k]
-		printClassDoc(class)
+		printClassDoc(class, changed)
 	}
 }
 
-func printClassDoc(c *Class) {
-	fmt.Printf("\\subsubsection{\\texttt{%s \\textcolor{blue}{%s}}}\n", c.Modifiers, c.Name)
+func printClassDoc(c *Class, changed bool) {
+	if changed && !c.changedClass() {
+		return
+	}
+	extra := ""
+	if !changed || c.changed() {
+		extra = "\\textit{Új osztály}"
+	}
+	fmt.Printf("\\subsubsection{\\texttt{%s \\textcolor{blue}{%s}} %s}\n", c.Modifiers, c.Name, extra)
+
 	fmt.Println("\\begin{itemize}")
+	if !changed || c.changed() {
+		if c.DocString != "" {
+			fmt.Println("\\item Felelősség:")
+			fmt.Println("\\newline")
+			fmt.Println(c.DocString)
+		}
 
-	if c.DocString != "" {
-		fmt.Println("\\item Felelősség:")
+		fmt.Println("\\item Ősosztályok:")
 		fmt.Println("\\newline")
-		fmt.Println(c.DocString)
-	}
-
-	fmt.Println("\\item Ősosztályok:")
-	fmt.Println("\\newline")
-	if c.Superclass.realClass != nil {
-		var loopy func(c *Class)
-		loopy = func(c *Class) {
-			if c.Superclass.realClass != nil {
-				loopy(c.Superclass.realClass)
-				fmt.Print(" $\\rightarrow$ ")
+		if c.Superclass.realClass != nil {
+			var loopy func(c *Class)
+			loopy = func(c *Class) {
+				if c.Superclass.realClass != nil {
+					loopy(c.Superclass.realClass)
+					fmt.Print(" $\\rightarrow$ ")
+				}
+				fmt.Printf("\\texttt{\\textcolor{blue}{%s}}", c.Name)
 			}
-			fmt.Printf("\\texttt{\\textcolor{blue}{%s}}", c.Name)
+			loopy(c)
+			fmt.Println()
+		} else {
+			fmt.Println("\\emph{Nincs ősosztály}")
 		}
-		loopy(c)
-		fmt.Println()
-	} else {
-		fmt.Println("\\emph{Nincs ősosztály}")
-	}
 
-	if !strings.Contains(c.Modifiers, "interface") {
+		if !strings.Contains(c.Modifiers, "interface") {
 
-		fmt.Println("\\item Interfészek:")
-		if len(c.Interfaces) == 0 {
-			fmt.Println("\\newline")
-			fmt.Println("\\emph{Nem valósít meg interfészeket}")
-		} else {
-			fmt.Println("\\begin{itemize}")
-			for _, i := range c.Interfaces {
-				fmt.Printf("\\item %s\n", i.Name)
+			fmt.Println("\\item Interfészek:")
+			if len(c.Interfaces) == 0 {
+				fmt.Println("\\newline")
+				fmt.Println("\\emph{Nem valósít meg interfészeket}")
+			} else {
+				fmt.Println("\\begin{itemize}")
+				for _, i := range c.Interfaces {
+					fmt.Printf("\\item %s\n", i.Name)
+				}
+				fmt.Println("\\end{itemize}")
 			}
-			fmt.Println("\\end{itemize}")
 		}
+	}
 
+	if changed && !c.changed() {
+		fmt.Println("\\item Változott attribútumok")
+	} else {
 		fmt.Println("\\item Attribútumok")
-		if len(c.Fields) == 0 {
-			fmt.Println("\\newline")
-			fmt.Println("\\emph{Nincsenek attribútumok}")
-		} else {
-			fmt.Println("\\begin{itemize}")
-			for _, attr := range c.Fields {
+	}
+	if len(c.Fields) == 0 {
+		fmt.Println("\\newline")
+		fmt.Println("\\emph{Nincsenek attribútumok}")
+	} else {
+		fmt.Println("\\begin{itemize}")
+		ch := false
+		for _, attr := range c.Fields {
+			if !changed || attr.changed() || c.changed() {
+				ch = true
 				fmt.Printf(`\item \texttt{%s \textcolor{blue}{%s} %s}`, attr.Modifiers, attr.Type.Name, attr.Name)
 				if attr.DocString != "" {
 					fmt.Printf(": %s", attr.DocString)
 				}
 				fmt.Println()
 			}
-			fmt.Println("\\end{itemize}")
 		}
-
+		if !ch {
+			fmt.Println("\\item \\textit{Nincsenek megváltozott attribútumok}")
+		}
+		fmt.Println("\\end{itemize}")
 	}
 
-	fmt.Println("\\item Metódusok")
+	if changed && !c.changed() {
+		fmt.Println("\\item Megváltozott metódusok")
+	} else {
+		fmt.Println("\\item Metódusok")
+	}
 	if len(c.Methods) == 0 {
 		fmt.Println("\\newline")
 		fmt.Println("\\emph{Nincsenek metódusok}")
 	} else {
 		fmt.Println("\\begin{itemize}")
+		ch := false
 		for _, meth := range c.Methods {
-			fmt.Printf(`\item \texttt{%s \textcolor{blue}{`, meth.Modifiers)
-			fmt.Printf("%s} ", meth.ReturnType.Name)
-			fmt.Printf("%s(", meth.Name)
-			for i, par := range meth.Parameters {
-				fmt.Printf("\\textcolor{blue}{%s} %s", par.Type.Name, par.Name)
-				if i != len(meth.Parameters)-1 {
-					fmt.Print(", ")
+			if !changed || meth.changed() || c.changed() {
+				ch = true
+				fmt.Printf(`\item \texttt{%s \textcolor{blue}{`, meth.Modifiers)
+				fmt.Printf("%s} ", meth.ReturnType.Name)
+				fmt.Printf("%s(", meth.Name)
+				for i, par := range meth.Parameters {
+					fmt.Printf("\\textcolor{blue}{%s} %s", par.Type.Name, par.Name)
+					if i != len(meth.Parameters)-1 {
+						fmt.Print(", ")
+					}
 				}
+				fmt.Print(")")
+				fmt.Printf("}")
+				if meth.DocString != "" {
+					fmt.Printf(": %s", meth.DocString)
+				}
+				fmt.Println()
 			}
-			fmt.Print(")")
-			fmt.Printf("}")
-			if meth.DocString != "" {
-				fmt.Printf(": %s", meth.DocString)
-			}
-			fmt.Println()
+		}
+		if !ch {
+			fmt.Println("\\item \\textit{Nincsenek megváltozott metódusok}")
 		}
 		fmt.Println("\n\\end{itemize}")
 	}