diff --git a/src/de/deadlocker8/budgetmaster/logic/Helpers.java b/src/de/deadlocker8/budgetmaster/logic/Helpers.java
index 2f72888eb3be208cac864d981b54b74ff7422cb3..a3761e796fd6ad0bd0a435ffe141d0d397e9fa34 100644
--- a/src/de/deadlocker8/budgetmaster/logic/Helpers.java
+++ b/src/de/deadlocker8/budgetmaster/logic/Helpers.java
@@ -5,10 +5,6 @@ import java.net.URLEncoder;
 import java.text.DecimalFormat;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
 
 public class Helpers
 {
@@ -35,46 +31,4 @@ public class Helpers
 		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
 		return date.format(formatter);
 	}
-	
-	public static ArrayList<CategoryBudget> getCategoryBudgets(CategoryHandler categoryHandler, ArrayList<Payment> payments)
-	{
-		ArrayList<CategoryBudget> budgets = new ArrayList<>();
-		
-		for(Category currentCategory : categoryHandler.getCategories())
-		{
-			budgets.add(new CategoryBudget(currentCategory.getName(), currentCategory.getColor(), 0));
-			CategoryBudget currentBudget = budgets.get(budgets.size() - 1);
-			for(Payment currentPayment : payments)
-			{
-				//filter rest
-				if(currentCategory.getID() != 2)
-				{
-					if(currentCategory.getID() == currentPayment.getCategoryID())
-					{
-						currentBudget.setBudget(currentBudget.getBudget() + currentPayment.getAmount());
-					}
-				}
-			}
-		}
-		
-		//filter empty categories
-		Iterator<CategoryBudget> iterator = budgets.iterator();
-		while(iterator.hasNext())
-		{		
-			if(iterator.next().getBudget() == 0)
-			{
-				iterator.remove();
-			}
-		}
-		
-		Collections.sort(budgets, new Comparator<CategoryBudget>() {
-	        @Override
-	        public int compare(CategoryBudget budget1, CategoryBudget budget2)
-	        {
-	            return  Double.compare(budget1.getBudget(), budget2.getBudget());
-	        }
-	    });		
-		
-		return budgets;		
-	}
 }
\ No newline at end of file
diff --git a/src/de/deadlocker8/budgetmaster/logic/ServerConnection.java b/src/de/deadlocker8/budgetmaster/logic/ServerConnection.java
index f7e9f6e4322679ede1540be594def47223937b6f..1792a896e1fe7e43e739e90eb4739fffa4744cc3 100644
--- a/src/de/deadlocker8/budgetmaster/logic/ServerConnection.java
+++ b/src/de/deadlocker8/budgetmaster/logic/ServerConnection.java
@@ -257,6 +257,31 @@ public class ServerConnection
 		reader.close();
 	}
 	
+	/*
+	 * CATEGORYBUDGET
+	 */
+	public ArrayList<CategoryBudget> getCategoryBudgets(int year, int month) throws Exception
+	{
+		URL url = new URL(settings.getUrl() + "/categorybudget?secret=" + Helpers.getURLEncodedString(settings.getSecret()) + "&year=" + year + "&month=" + month);
+		HttpsURLConnection httpsCon = (HttpsURLConnection)url.openConnection();
+		httpsCon.setDoOutput(true);
+		httpsCon.setRequestMethod("GET");
+
+		if(httpsCon.getResponseCode() == HttpsURLConnection.HTTP_OK)
+		{
+			String result = Read.getStringFromInputStream(httpsCon.getInputStream());
+			// required by GSON
+			Type listType = new TypeToken<ArrayList<CategoryBudget>>()
+			{
+			}.getType();
+			return gson.fromJson(result, listType);
+		}
+		else
+		{
+			return null;
+		}
+	}
+	
 	/*
 	 * REST
 	 */
diff --git a/src/de/deadlocker8/budgetmaster/ui/Controller.java b/src/de/deadlocker8/budgetmaster/ui/Controller.java
index 409f3e0a448620161d798343d7a502fe36ff11de..2175ef4717a68a94833cdd5ab119e87f15a9b1b5 100644
--- a/src/de/deadlocker8/budgetmaster/ui/Controller.java
+++ b/src/de/deadlocker8/budgetmaster/ui/Controller.java
@@ -11,7 +11,6 @@ import org.joda.time.DateTime;
 
 import de.deadlocker8.budgetmaster.logic.CategoryBudget;
 import de.deadlocker8.budgetmaster.logic.CategoryHandler;
-import de.deadlocker8.budgetmaster.logic.Helpers;
 import de.deadlocker8.budgetmaster.logic.NormalPayment;
 import de.deadlocker8.budgetmaster.logic.Payment;
 import de.deadlocker8.budgetmaster.logic.ServerConnection;
@@ -284,7 +283,7 @@ public class Controller implements Refreshable
 			
 			categoryHandler = new CategoryHandler(connection.getCategories());
 			
-			categoryBudgets = Helpers.getCategoryBudgets(categoryHandler, payments);		
+			categoryBudgets = connection.getCategoryBudgets(currentDate.getYear(), currentDate.getMonthOfYear());		
 		}
 		catch(Exception e)
 		{
diff --git a/src/de/deadlocker8/budgetmaster/ui/cells/PaymentCell.java b/src/de/deadlocker8/budgetmaster/ui/cells/PaymentCell.java
index f352121faddc2a65efae6f42b0fe81852bdaab11..8a6b957911d7bf78d4bb359eb197b4e8c737f39b 100644
--- a/src/de/deadlocker8/budgetmaster/ui/cells/PaymentCell.java
+++ b/src/de/deadlocker8/budgetmaster/ui/cells/PaymentCell.java
@@ -22,6 +22,7 @@ import javafx.scene.control.ButtonBar.ButtonData;
 import javafx.scene.control.ButtonType;
 import javafx.scene.control.Label;
 import javafx.scene.control.ListCell;
+import javafx.scene.control.Tooltip;
 import javafx.scene.layout.HBox;
 import javafx.scene.layout.Priority;
 import javafx.scene.layout.Region;
@@ -102,7 +103,11 @@ public class PaymentCell extends ListCell<Payment>
 			labelCircle.getStyleClass().add("greylabel");
 			String textColor = ConvertTo.toRGBHex(ConvertTo.getAppropriateTextColor(category.getColor()));
 			labelCircle.setStyle("-fx-background-color: " + ConvertTo.toRGBHex(category.getColor()) + "; -fx-background-radius: 50%; -fx-text-fill: " + textColor + "; -fx-font-weight: bold; -fx-font-size: 20;");
+			Tooltip tooltip = new Tooltip(categoryName);
+			tooltip.setStyle("-fx-font-size: 14");
+			labelCircle.setTooltip(tooltip);
 			hbox.getChildren().add(labelCircle);
+			
 
 			Label labelName = new Label(item.getName());
 			labelName.setPrefHeight(HEIGHT);
diff --git a/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java b/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java
index c8957581ece82c9e1100e422dc067d2d2b9d413c..4c9951379aa1ace35f022a0f161ea8cd7df5c196 100644
--- a/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java
+++ b/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java
@@ -20,6 +20,7 @@ import de.deadlocker8.budgetmasterserver.server.category.CategoryDelete;
 import de.deadlocker8.budgetmasterserver.server.category.CategoryGet;
 import de.deadlocker8.budgetmasterserver.server.category.CategoryGetAll;
 import de.deadlocker8.budgetmasterserver.server.category.CategoryUpdate;
+import de.deadlocker8.budgetmasterserver.server.categorybudget.CategoryBudgetGet;
 import de.deadlocker8.budgetmasterserver.server.payment.normal.PaymentAdd;
 import de.deadlocker8.budgetmasterserver.server.payment.normal.PaymentDelete;
 import de.deadlocker8.budgetmasterserver.server.payment.normal.PaymentGet;
@@ -85,6 +86,9 @@ public class SparkServer
 		post("/repeatingpayment", new RepeatingPaymentAdd(handler));
 		delete("/repeatingpayment", new RepeatingPaymentDelete(handler));
 		
+		// CategoryBudget
+		get("/categorybudget", new CategoryBudgetGet(handler, gson));
+		
 		// Rest
 		get("/rest", new RestGet(handler, gson));
 
diff --git a/src/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java b/src/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java
new file mode 100644
index 0000000000000000000000000000000000000000..0b0859c69771c6405bf01921b09e09928f6ea535
--- /dev/null
+++ b/src/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java
@@ -0,0 +1,112 @@
+package de.deadlocker8.budgetmasterserver.server.categorybudget;
+
+import static spark.Spark.halt;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+
+import com.google.gson.Gson;
+
+import de.deadlocker8.budgetmaster.logic.Category;
+import de.deadlocker8.budgetmaster.logic.CategoryBudget;
+import de.deadlocker8.budgetmaster.logic.Payment;
+import de.deadlocker8.budgetmasterserver.main.DatabaseHandler;
+import spark.Request;
+import spark.Response;
+import spark.Route;
+
+public class CategoryBudgetGet implements Route
+{
+	private DatabaseHandler handler;
+	private Gson gson;
+
+	public CategoryBudgetGet(DatabaseHandler handler, Gson gson)
+	{
+		this.handler = handler;
+		this.gson = gson;
+	}
+
+	@Override
+	public Object handle(Request req, Response res) throws Exception
+	{
+		if(!req.queryParams().contains("year") || !req.queryParams().contains("month"))
+		{
+			halt(400, "Bad Request");
+		}
+		
+		int year = 0;
+		int month = 0;
+		
+		try
+		{				
+			year = Integer.parseInt(req.queryMap("year").value());
+			month = Integer.parseInt(req.queryMap("month").value());
+			
+			if(year < 0 || month < 1 || month > 12)
+			{
+				halt(400, "Bad Request");
+			}
+			
+			try
+			{	
+				ArrayList<Payment> payments = new ArrayList<>();
+				payments.addAll(handler.getPayments(year, month));
+				payments.addAll(handler.getRepeatingPayments(year, month));			
+				Collections.sort(payments, new Comparator<Payment>() {
+			        @Override
+			        public int compare(Payment payment1, Payment payment2)
+			        {
+			            return  payment2.getDate().compareTo(payment1.getDate());
+			        }
+			    });	
+				
+				ArrayList<CategoryBudget> budgets = new ArrayList<>();
+				
+				for(Category currentCategory : handler.getCategories())
+				{
+					budgets.add(new CategoryBudget(currentCategory.getName(), currentCategory.getColor(), 0));
+					CategoryBudget currentBudget = budgets.get(budgets.size() - 1);
+					for(Payment currentPayment : payments)
+					{					
+						if(currentCategory.getID() == currentPayment.getCategoryID())
+						{
+							currentBudget.setBudget(currentBudget.getBudget() + currentPayment.getAmount());
+						}						
+					}
+				}
+				
+				//filter empty categories
+				Iterator<CategoryBudget> iterator = budgets.iterator();
+				while(iterator.hasNext())
+				{		
+					if(iterator.next().getBudget() == 0)
+					{
+						iterator.remove();
+					}
+				}
+				
+				Collections.sort(budgets, new Comparator<CategoryBudget>() {
+			        @Override
+			        public int compare(CategoryBudget budget1, CategoryBudget budget2)
+			        {
+			            return  Double.compare(budget1.getBudget(), budget2.getBudget());
+			        }
+			    });		
+				
+				return gson.toJson(budgets);
+			}
+			catch(IllegalStateException ex)
+			{
+				halt(500, "Internal Server Error");
+			}
+		}
+		catch(Exception e)
+		{
+			halt(400, "Bad Request");
+		}
+		
+		return null;
+	}
+}
\ No newline at end of file