diff --git a/VIPSWeb/static/js/forecastmap.js b/VIPSWeb/static/js/forecastmap.js
index 1da1118a7b6a29c2768e9d198b8e699a8c863246..ead65187770a3691e0d4ce7be875a0dbed1812c6 100644
--- a/VIPSWeb/static/js/forecastmap.js
+++ b/VIPSWeb/static/js/forecastmap.js
@@ -67,7 +67,7 @@ function initForecastMap(lonLat, zoomLevel, mapAttribution)
 	
 	forecastLayer = new ol.layer.Vector({
 		source: new ol.source.Vector({
-			url: "http://" + settings.vipslogicServerName + "/rest/forecastresults/aggregate/" + settings.vipsOrganizationId + "?" + buildPathParamString("cropOrganismId", getSelectedCropIds()),
+			url: "http://" + settings.vipslogicServerName + "/rest/forecastresults/aggregate/" + settings.vipsOrganizationId + "?" + buildPathParamString("cropCategoryId", getSelectedCropCategoryIds()),
 			format: new ol.format.KML({"extractAttributes":true}),
 			projection: ol.proj.get('EPSG:3857')
 		})
@@ -191,7 +191,7 @@ function initForecastMap(lonLat, zoomLevel, mapAttribution)
 	    			  + "</ul>";
     		  }
 
-	    	  console.log(feature);
+	    	  //console.log(feature);
 	    	  poiDetails.popover({
           		animation: true,
           		trigger: 'manual',
@@ -334,11 +334,11 @@ function getCurrentMapZoomLevel()
 function updateForecastLayers()
 {
 	map.removeLayer(forecastLayer);
-	var cropOrganismIdStr = buildPathParamString("cropOrganismId", getSelectedCropIds());
+	var cropCategoryIdStr = buildPathParamString("cropCategoryId", getSelectedCropCategoryIds());
 	// If empty, make sure we send a number anyway
-	if(cropOrganismIdStr === "")
+	if(cropCategoryIdStr === "")
 	{
-		cropOrganismIdStr = "&cropOrganismId=-1";
+		cropCategoryIdStr = "&cropCategoryId=-1";
 	}
 	/*forecastLayer = new ol.layer.Vector({
 		source: new ol.source.KML({
@@ -348,7 +348,7 @@ function updateForecastLayers()
 		});*/
 	forecastLayer = new ol.layer.Vector({
 		source: new ol.source.Vector({
-			url: "http://" + settings.vipslogicServerName + "/rest/forecastresults/aggregate/" + settings.vipsOrganizationId + "?" + cropOrganismIdStr,
+			url: "http://" + settings.vipslogicServerName + "/rest/forecastresults/aggregate/" + settings.vipsOrganizationId + "?" + cropCategoryIdStr,
 			format: new ol.format.KML(),
 			projection: ol.proj.get('EPSG:3857')
 		})
diff --git a/VIPSWeb/static/js/frontpage.js b/VIPSWeb/static/js/frontpage.js
index 487cd4dee4dc0b256ea15aadea4b20da6b836a74..983b3d62dbde8bb50775a0efc746d8e775999687 100644
--- a/VIPSWeb/static/js/frontpage.js
+++ b/VIPSWeb/static/js/frontpage.js
@@ -31,18 +31,33 @@
  * Which crops have been selected? Checks the form
  * @returns
  */
-function getSelectedCropIds()
+function getSelectedCropCategoryIds()
 {
-	selectedCropIds = [];
-	formFields = document.getElementsByName("cropIds");
+	selectedCropCategoryIds = [];
+	formFields = document.getElementsByName("cropCategoryIds");
 	for(var i=0;i<formFields.length;i++)
 	{
 		if(formFields[i].checked)
 		{
-			selectedCropIds = selectedCropIds.concat(eval(formFields[i].value));
+			selectedCropCategoryIds.push(parseInt(formFields[i].value));
 		}
 	}
-	return selectedCropIds;
+	return selectedCropCategoryIds;
+}
+
+function getSelectedCropIds()
+{
+	var selectedCropCategoryIds = getSelectedCropCategoryIds();
+	var selectedCropIdsTemp = [];
+	for(var i in settings.cropCategories)
+	{
+		if(selectedCropCategoryIds.indexOf(settings.cropCategories[i]["cropCategoryId"]) >= 0)
+		{
+			selectedCropIdsTemp = selectedCropIdsTemp.concat(settings.cropCategories[i]["cropOrganismIds"]);
+		}
+	}
+	// This trick ensures all elements in array are unique
+	return selectedCropIdsTemp.filter(function(value,index,self){return self.indexOf(value) === index;});
 }
 
 var allObservations;
@@ -54,8 +69,8 @@ function cacheObservations()
 		allObservations = json;
 		//console.log(allObservations);
 		filterObservations();
-	}
-);
+		}
+	);
 }
 
 /**
@@ -90,7 +105,6 @@ function renderObservationMessages()
 		
 		messagesLeftColTBody.innerHTML += '<tr>\n<td class="dateCell">' + getStandardFormattedDate(observation["timeOfObservation"]) + '</td><td><a href="/observations/' + observation["observationId"] + '">' + observation["observationHeading"] + '</a></td>\n</tr>';
 	}
-	
 }
 
 var allMessages;
@@ -113,20 +127,6 @@ function cacheMessages()
  */
 function renderMessages()
 {
-	/*for(var i in settings.frontpageMessageTagIds)
-	{
-		var tagId = settings.frontpageMessageTagIds[i];
-		document.getElementById("tbody_messageTag_" + tagId).innerHTML = "";
-		tagMessages = filteredMessages[tagId];
-		//console.log(tagMessages);
-		for(var j in tagMessages)
-		{
-			var tagMessage = tagMessages[j];
-			document.getElementById("tbody_messageTag_" + tagId).innerHTML += 
-				'<tr><td class="dateCell">' + tagMessage["datePub"] + '</td><td><a href="/messages/' + tagMessage["messageId"] + '">' + getMessageLocale(tagMessage, settings.currentLanguage,settings.languageCode)["heading"] + '</a></td></tr>';
-			
-		}
-	}*/
 	var messagesRightColTBody = document.getElementById("messagesRightColTBody");
 	messagesRightColTBody.innerHTML = "";
 	
@@ -147,7 +147,6 @@ function renderMessages()
 function filterMessages()
 {
 	var selectedCropIds = getSelectedCropIds();
-	//console.log(selectedCropIds);
 	filteredMessages = [];
 	for(var tagI in allMessages)
 	{
@@ -156,23 +155,23 @@ function filterMessages()
 		for(var mI in allMessages[tagI])
 		{
 			var message = allMessages[tagI][mI];
-			var messageCropOrganismIds = message["messageCropOrganismIds"];
-			if(messageCropOrganismIds.length == 0)
+			var cropCategoryIds = message["cropCategoryIds"];
+			if(cropCategoryIds.length == 0)
 			{
 				//filteredForTag.push(message);
 				filteredMessages.push(message);
 			}
 			else
 			{
-				for(var mCOI in messageCropOrganismIds)
+				for(var cci in cropCategoryIds)
 				{
 					//console.log(messageCropOrganismIds[mCOI]);
-					if(selectedCropIds.indexOf(messageCropOrganismIds[mCOI]) >= 0)
+					/*if(selectedCropIds.indexOf(messageCropOrganismIds[mCOI]) >= 0)
 					{
 						//filteredForTag.push(message);
 						filteredMessages.push(message);
 						break;
-					}
+					}*/
 				}
 			}
 		}
@@ -235,6 +234,7 @@ function renderForecastConfigurationSummaries(forecastConfigurations)
 	forecastSummariesTable.innerHTML = summariesHTML;
 	forecastSummariesTable.style.display="block";
 	//document.getElementById("emptyForecastSummariesTableInfo").style.display="none";
+	
 }
 
 /**
@@ -283,8 +283,6 @@ function renderMyForecastConfigurationSummaries()
 		return;
 	}
 	
-	console.log(myForecastConfigurations);
-	
 	var mySummariesHTML = getforecastSummariesTableHTML(myForecastConfigurations,false, true);
 	myForecastSummariesTable.innerHTML = mySummariesHTML;
 	//document.getElementById("myForecastSummariesContainer").style.display = "block";
@@ -570,17 +568,15 @@ function updateForecastSummaries()
 	// Iterate all forecast summaries, filter by crop (must be among the selected crops)
 	// and location on the map (must be visible on the map) 
 	var selectedCropIds = getSelectedCropIds();
-	
 	var filteredForecastSummaries = [];
 	for(var i in cachedForecastSummaries)
 	{
 		var forecastSummary = cachedForecastSummaries[i];
-		//console.log(forecastSummary);
 		// Filter by crop
 		var isASelectedCrop = false;
 		for(var j in selectedCropIds)
 		{
-			if(selectedCropIds[j] === forecastSummary.cropOrganismId.organismId)
+			if(selectedCropIds.indexOf(forecastSummary.cropOrganismId.organismId) > 0)
 			{
 				isASelectedCrop = true;
 			}
@@ -615,7 +611,18 @@ function updateForecastSummaries()
 	
 	renderForecastConfigurationSummaries(filteredForecastSummaries);
 	
-	
+}
+
+function getOrganismIdsForCropCategory(cropCategoryId)
+{
+	for(var i in settings.cropCategories)
+	{
+		if(settings.cropCategories[i]["crop_group_id"] == cropCategoryId)
+		{
+			return settings.cropCategories[i]["crop_ids"];
+		}
+	}
+	return [];
 }
 
 /**
@@ -696,9 +703,9 @@ function getExternalResourcesForPoi(poiId)
  * TODO: If user logged in, store in user session on server for
  * global access on clients where the user is logged in
  */
-function storeSelectedCropIds()
+function storeSelectedCropCategoryIds()
 {
-	storeLocalSettings({"selectedCropIds":getSelectedCropIds()});
+	storeLocalSettings({"selectedCropCategoryIds":getSelectedCropCategoryIds()});
 }
 
 /**
@@ -706,16 +713,16 @@ function storeSelectedCropIds()
  * TODO: Add server as persistence layer when login system is
  * implemented
  */
-function restoreSelectedCropIds()
+function restoreSelectedCropCategoryIds()
 {
 	// localStorage only stores strings, so we must recreate as array
-	var selectedCropIds = getLocalSettings(["selectedCropIds"]) != null ?
-							getLocalSettings(["selectedCropIds"])["selectedCropIds"].split(",")
+	var selectedCropCategoryIds = getLocalSettings(["selectedCropCategoryIds"]) != null ?
+							getLocalSettings(["selectedCropCategoryIds"])["selectedCropCategoryIds"].split(",")
 							: null;
-	if(selectedCropIds != null)
+	if(selectedCropCategoryIds != null)
 	{
 		// Loop through existing crops, set as checked/unchecked
-		formFields = document.getElementsByName("cropIds");
+		formFields = document.getElementsByName("cropCategoryIds");
 		for(i in formFields)
 		{
 			if(formFields[i].value == undefined)
@@ -723,10 +730,10 @@ function restoreSelectedCropIds()
 				continue;
 			}
 			var previouslySelected = false;
-			for(var j in selectedCropIds)
+			for(var j in selectedCropCategoryIds)
 			{
 				// Need to use eval() as values are strings with [] representing arrays
-				if(eval(formFields[i].value).indexOf(parseInt(selectedCropIds[j])) >=0)
+				if(parseInt(formFields[i].value) == parseInt(selectedCropCategoryIds[j]))
 				{
 					previouslySelected = true;
 				}
@@ -756,7 +763,6 @@ function removeFromMyForecastConfigurations(forecastConfigurationId)
 	{
 		myForecastConfigurationIds.splice(spliceIndex,1);
 	}
-	console.log(myForecastConfigurationIds);
 	storeLocalSettings({"myForecastConfigurationIds":myForecastConfigurationIds});
 	updateForecastSummaries();
 }
diff --git a/VIPSWeb/templates/index.html b/VIPSWeb/templates/index.html
index 621ff771eb3431b25e893aa4975770bec2e3be0a..abe99296d3faef6bc5cfb6aa9476399facb361af 100644
--- a/VIPSWeb/templates/index.html
+++ b/VIPSWeb/templates/index.html
@@ -47,10 +47,11 @@
 			latitude = parseFloat(storedMapSettings["latitude"]);
 			zoomLevel = parseInt(storedMapSettings["zoomLevel"]);
 		}
+		restoreSelectedCropCategoryIds();
 		// Init frontpage map. Depending on forecastmap.js.
 		initForecastMap([longitude,latitude],zoomLevel,"{{settings.MAP_ATTRIBUTION|safe}}");
 		cachePois();
-		restoreSelectedCropIds();
+		
 		cacheMessages();
 		cacheObservations();
 		cachePrivateForecastSummaries();
@@ -83,10 +84,11 @@
 			<div id="cropList" class="mapBoxPlacement_{{settings.MAP_CROP_LIST_PLACEMENT}}">
 				<h3>{% trans "Crops" %}</h3>
 				<ul class="cropList single">
-					{% for crop_group in crop_groups %}
+				<!--ul-->
+					{% for crop_category in crop_categories %}
 					<li>
-						<input type="checkbox" name="cropIds" id="cropIds_{{crop_group.crop_ids|slugify}}" value="{{crop_group.crop_ids}}" checked="checked" onchange="refreshForecasts({{settings.VIPS_ORGANIZATION_ID}},'{{settings.VIPSLOGIC_SERVER_NAME}}');storeSelectedCropIds();filterMessages();filterObservations();"/>
-						<label for="cropIds_{{crop_group.crop_ids|slugify}}"><span></span>{{ crop_group.name|safe }}</label>
+						<input type="checkbox" name="cropCategoryIds" id="cropCategoryIds_{{crop_category.crop_category_id}}" value="{{crop_category.crop_category_id}}" checked="checked" onchange="refreshForecasts({{settings.VIPS_ORGANIZATION_ID}},'{{settings.VIPSLOGIC_SERVER_NAME}}');storeSelectedCropCategoryIds();filterMessages();filterObservations();"/>
+						<label for="cropCategoryIds_{{crop_category.crop_category_id}}"><span></span>{{ crop_category.name|safe }}</label>
 					</li>
 					{% endfor %}
 				</ul>
diff --git a/VIPSWeb/templates/settings.js b/VIPSWeb/templates/settings.js
index 87b2d20e537f3053dd6879dcb56f4f3bf27a12fc..93b7265b9489c4705dc79f79aa2e17115a66278c 100644
--- a/VIPSWeb/templates/settings.js
+++ b/VIPSWeb/templates/settings.js
@@ -19,5 +19,7 @@ var settings = {
 		
 		frontpageMessageTagIds: {{settings.FRONTPAGE_MESSAGE_TAG_IDS}},
 		
-		userUuid: {% if request.session.vips_logic_user == None %}null{% else %}"{{request.session.user_uuid}}"{% endif %}
+		userUuid: {% if request.session.vips_logic_user == None %}null{% else %}"{{request.session.user_uuid}}"{% endif %},
+		
+		cropCategories : {{crop_categories|safe}}
 };
diff --git a/VIPSWeb/views.py b/VIPSWeb/views.py
index 20c66b93545d4f8b4b6f0a029108e370ac00510a..9d9aa2c9dcca54ddd81e8650ebb647ff49eb5412 100644
--- a/VIPSWeb/views.py
+++ b/VIPSWeb/views.py
@@ -21,7 +21,7 @@ from django.http import HttpResponse, JsonResponse
 from django.conf import settings
 from django.utils import translation
 from vips_messages.models import Message, MessageTag
-from organisms.models import CropGroup
+from organisms.models import CropCategory
 
 def index(request):
     # Get front page categories. This is defined in local_settings.py
@@ -29,13 +29,13 @@ def index(request):
     # Last 10 messages
     context = {
               'message_tags': message_tags,
-              'crop_groups': CropGroup.get_crop_groups(translation.get_language())
+              'crop_categories': CropCategory.get_crop_categories(translation.get_language())
               }
     return render(request, 'index.html', context)
 
 # Serving settings for JavaScript
 def settings_js(request):
-    context = {}
+    context = {'crop_categories': CropCategory.get_crop_categories_from_vipslogic_as_text()}
     return render(request,'settings.js', context, content_type="application/javascript;charset=UTF-8")
 
 ## TODO: Is this being used???
diff --git a/organisms/models.py b/organisms/models.py
index 40bf8e770574640807768601701e066ebf49c799..9f47030a25c3a1810e90707a714d4ed599282f16 100644
--- a/organisms/models.py
+++ b/organisms/models.py
@@ -20,28 +20,45 @@ import requests
 from django.conf import settings
 from django.utils import translation
 
-class CropGroup:
+class CropCategory:
     def __init__(self,
-                 crop_group_id,
+                 crop_category_id,
                  name,
                  crop_ids
                  ): 
-        self.crop_group_id = crop_group_id
+        self.crop_category_id = crop_category_id
         self.name = name
         self.crop_ids = crop_ids
     
     @staticmethod
-    def get_crop_groups(language):
-        crop_groups = []
-        for item in settings.CROP_GROUPS:
-            crop_groups.append(CropGroup.get_instance_from_dict(item,language))
-        return crop_groups
+    def get_crop_categories(language):
+        crop_categories = []
+        for item in CropCategory.get_crop_categories_from_vipslogic_as_json():
+            crop_categories.append(CropCategory.get_instance_from_dict(item,language))
+        return crop_categories
+    
+    @staticmethod
+    def get_crop_categories_from_vipslogic():
+        request_result = requests.get("http://%s/rest/organism/cropcategory/%s" % (settings.VIPSLOGIC_SERVER_NAME, settings.VIPS_ORGANIZATION_ID))
+        return request_result
+    
+    @staticmethod
+    def get_crop_categories_from_vipslogic_as_json():
+        return CropCategory.get_crop_categories_from_vipslogic().json()
+    
+    @staticmethod
+    def get_crop_categories_from_vipslogic_as_text():
+        return CropCategory.get_crop_categories_from_vipslogic().text
     
     @staticmethod
     def get_instance_from_dict(dict,language):
-        return CropGroup(dict["crop_group_id"],
-                         dict["name"].get(language,dict["name"]["en"]),
-                         dict["crop_ids"]
+        local_name = dict["defaultName"]
+        for crop_category_local in dict["cropCategoryLocalSet"]:
+            if crop_category_local["cropCategoryLocalPK"]["locale"] == language:
+                local_name = crop_category_local["localName"]
+        return CropCategory(dict["cropCategoryId"],
+                         local_name,
+                         dict["cropOrganismIds"]
                          )