Index: /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Controllers/OkbManagementController.cs
===================================================================
--- /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Controllers/OkbManagementController.cs	(revision 13870)
+++ /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Controllers/OkbManagementController.cs	(revision 13871)
@@ -2,16 +2,21 @@
 using HeuristicLab.Clients.Hive.WebJobManager.Services.Imports;
 using HeuristicLab.Clients.Hive.WebJobManager.ViewModels;
+using HeuristicLab.Common;
+using HeuristicLab.Optimization;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
 
 namespace HeuristicLab.Clients.Hive.WebJobManager.Controllers
 {
-    public class OkbManagementController: Controller
+    public class OkbManagementController : Controller
     {
         private OkbManagementVM vm;
         private WebLoginService weblog;
         private Guid userId;
-        
+
         private bool init()
         {
@@ -26,6 +31,9 @@
                 userId = Guid.Parse(u);
                 vm = new OkbManagementVM(weblog.getCurrentUser(userId), weblog.getOkbAdminClient(userId));
-                if(vm.client != null)
+                if (vm.client != null)
+                {
+                    vm.client.Refresh();
                     return true;
+                }
             }
             return false;
@@ -46,4 +54,71 @@
             }
         }
+
+        [HttpPost]
+        public async Task<IActionResult> Uploader(ICollection<IFormFile> fileupl, string name, int id)
+        {
+            if (init())
+            {
+                try
+                {
+                    byte[] data = null;
+                    foreach (var file in fileupl)
+                    {
+                        if (file.Length > 0)
+                        {
+                            using (var fileStream = file.OpenReadStream())
+                            using (var ms = new MemoryStream())
+                            {
+                                fileStream.CopyTo(ms);
+                                data = ms.ToArray();
+                                // act on the Base64 data
+                            }
+                        }
+                    }
+                    var deser = PersistenceUtil.Deserialize<IOptimizer>(data);
+                    OKB.Administration.IOKBItem obj = null;
+                    if (name == "Algorithms" && deser is IAlgorithm)
+                    {
+                        vm.client.UpdateAlgorithmData((long)id, PersistenceUtil.Serialize(deser));
+                        vm.message = "Upload has been completed, the file is now set as the new algorithm for " + vm.client.Algorithms.Find(x => x.Id == id).Name;
+                        obj = vm.client.Algorithms.Find(x => x.Id == id);
+                        ((OKB.Administration.Algorithm)obj).DataTypeName = deser.GetType().Name;
+                        ((OKB.Administration.Algorithm)obj).DataTypeTypeName = deser.GetType().AssemblyQualifiedName;
+                    }
+                    else if (name == "Problems" && deser is IProblem)
+                    {
+                        vm.client.UpdateProblemData((long)id, PersistenceUtil.Serialize(deser));
+                        vm.message = "Upload has been completed, the file is now set as the new problem for " + vm.client.Problems.Find(x => x.Id == id).Name;
+                        obj = vm.client.Problems.Find(x => x.Id == id);
+                        ((OKB.Administration.Problem)obj).DataTypeName = deser.GetType().Name;
+                        ((OKB.Administration.Problem)obj).DataTypeTypeName = deser.GetType().AssemblyQualifiedName;
+                    }
+                    else
+                    {
+                        throw new Exception();
+                    }
+                    
+                    vm.client.Store(obj);
+                    ViewBag.Title = "Upload complete - OKB Management";
+                    ViewBag.Success = true;
+
+                }
+                catch (Exception e)
+                {
+
+                    vm.message = "Upload failed, please try again.";
+                    ViewBag.Success = false;
+                    ViewBag.Title = "Upload failed - OKB Management";
+
+                }
+                ViewBag.SessionId = HttpContext.Session.GetString("UserId");
+                vm.client.Refresh();
+                return View("Index", vm);
+            }
+            else
+            {
+                return RedirectToAction("Index", "Query");
+            }
+        }
     }
 }
Index: /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/HeuristicLab.Clients.Hive.WebJobManager.xproj.user
===================================================================
--- /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/HeuristicLab.Clients.Hive.WebJobManager.xproj.user	(revision 13870)
+++ /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/HeuristicLab.Clients.Hive.WebJobManager.xproj.user	(revision 13871)
@@ -4,4 +4,5 @@
     <ActiveDebugProfile>RC1toRC2</ActiveDebugProfile>
     <ShowAllFiles>true</ShowAllFiles>
+    <NameOfLastUsedPublishProfile>HLHiveWeb - Web Deploy</NameOfLastUsedPublishProfile>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
Index: /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Hubs/OkbManagerHub.cs
===================================================================
--- /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Hubs/OkbManagerHub.cs	(revision 13870)
+++ /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Hubs/OkbManagerHub.cs	(revision 13871)
@@ -1,5 +1,8 @@
 ﻿using HeuristicLab.Clients.Hive.WebJobManager.Services;
 using HeuristicLab.Clients.Hive.WebJobManager.Services.Imports;
+using HeuristicLab.Clients.OKB.Administration;
 using Microsoft.AspNetCore.SignalR;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
 using System;
 using System.Collections.Generic;
@@ -31,4 +34,116 @@
             }
         }
+        public void Save(string json, string name)
+        {
+            loader();
+            JObject obj = JObject.Parse(json);
+            NamedOKBItem tostore = null;
+            Type objtype = null;
+            int id = ((int)obj.GetValue("Id"));
+            switch (name)
+            {
+                case "Algorithms":
+                    objtype = typeof(Algorithm);
+                    if (id != -1)
+                        tostore = adminclient.Algorithms.Find(x => x.Id == id);
+                    else
+                        tostore = new Algorithm();
+                    break;
+                case "Platforms":
+                    objtype = typeof(Platform);
+                    if (id != -1)
+                        tostore = adminclient.Platforms.Find(x => x.Id == id);
+                    else
+                        tostore = new Platform();
+                    break;
+                case "Algorithm classes":
+                    objtype = typeof(AlgorithmClass);
+                    if (id != -1)
+                        tostore = adminclient.AlgorithmClasses.Find(x => x.Id == id);
+                    else
+                        tostore = new AlgorithmClass();
+                    break;
+                case "Problem classes":
+                    objtype = typeof(ProblemClass);
+                    if (id != -1)
+                        tostore = adminclient.ProblemClasses.Find(x => x.Id == id);
+                    else
+                        tostore = new ProblemClass();
+                    break;
+                case "Problems":
+                    objtype = typeof(Problem);
+                    if (id != -1)
+                        tostore = adminclient.Problems.Find(x => x.Id == id);
+                    else
+                        tostore = new Problem();
+                    break;
+            }
+            tostore.Name = obj.GetValue("Name").ToString();
+            tostore.Description = obj.GetValue("Description").ToString();
+            if (objtype == typeof(Algorithm))
+            {
+                ((Algorithm)tostore).PlatformId = ((int)obj.GetValue("PlatformId"));
+                ((Algorithm)tostore).AlgorithmClassId = ((int)obj.GetValue("AlgorithmClassId"));
+
+            }
+            else if (objtype == typeof(Problem))
+            {
+                ((Problem)tostore).PlatformId = ((int)obj.GetValue("PlatformId"));
+                ((Problem)tostore).ProblemClassId = ((int)obj.GetValue("ProblemClassId"));
+            }
+            adminclient.Store(tostore);
+            Clients.Caller.saveComplete("Succesfully saved");
+            refresh(name);
+        }
+
+        public void Delete(string id, string name)
+        {
+            loader();
+            IOKBItem todel = null;
+            int todelid = int.Parse(id);
+            switch (name)
+            {
+                case "Algorithms":
+                    todel = adminclient.Algorithms.Find(x => x.Id == todelid);
+                    break;
+                case "Platforms":
+                    todel = adminclient.Platforms.Find(x => x.Id == todelid);
+                    break;
+                case "Algorithm classes":
+                    todel = adminclient.AlgorithmClasses.Find(x => x.Id == todelid);
+                    break;
+                case "Problem classes":
+                    todel = adminclient.ProblemClasses.Find(x => x.Id == todelid);
+                    break;
+                case "Problems":
+                    todel = adminclient.Problems.Find(x => x.Id == todelid);
+                    break;
+            }
+            adminclient.Delete(todel);
+            Clients.Caller.deleteComplete("Succesfully deleted");
+            refresh(name);
+        }
+        private void refresh(string name)
+        {
+            adminclient.Refresh();
+            switch (name)
+            {
+                case "Algorithms":
+                    Clients.Caller.refreshData("algos", JsonConvert.SerializeObject(adminclient.Algorithms));
+                    break;
+                case "Platforms":
+                    Clients.Caller.refreshData("platforms", JsonConvert.SerializeObject(adminclient.Platforms));
+                    break;
+                case "Algorithm classes":
+                    Clients.Caller.refreshData("algoclass", JsonConvert.SerializeObject(adminclient.AlgorithmClasses));
+                    break;
+                case "Problem classes":
+                    Clients.Caller.refreshData("probclass", JsonConvert.SerializeObject(adminclient.ProblemClasses));
+                    break;
+                case "Problems":
+                    Clients.Caller.refreshData("problems", JsonConvert.SerializeObject(adminclient.Problems));
+                    break;
+            }
+        }
     }
 }
Index: /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Scripts/Hubs/OkbManagerHubber.js
===================================================================
--- /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Scripts/Hubs/OkbManagerHubber.js	(revision 13870)
+++ /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Scripts/Hubs/OkbManagerHubber.js	(revision 13871)
@@ -22,5 +22,7 @@
     var vm = $scope;
     var hubber = $.connection.okbManagerHub;
-    vm.currentData = {'name' : '', 'data' : null}
+   $("#success-alert").hide();
+
+    vm.currentData = {'name' : '','type': '' , 'data' : null}
 
     vm.init = function () {
@@ -29,10 +31,18 @@
         $.connection.hub.qs = { 'userid': uid };
         //Connection string set to identify the unique session ID for the user
-        $.connection.hub.start().done(function () {
-           // hubber.server.requestInfo();//initial data request
-        });
-        hubber.client.processData = function (filters) {
-
+        $.connection.hub.start().done();
+        hubber.client.deleteComplete = function (text) {
+            vm.notify(text);
+            $scope.$apply();
         };
+        hubber.client.saveComplete = function (text) {
+            vm.notify(text);
+            $scope.$apply();
+        }
+        hubber.client.refreshData = function ( name, json) {
+            vm.initData(JSON.parse(json), name);
+            vm.selectDataCat(name); 
+            $scope.$apply();
+        }
 
     }
@@ -41,17 +51,22 @@
         switch (name) {
             case "platforms":
-                vm.platforms = {'selected' : null, 'arr' : coll}
+                vm.platforms = { 'selected': null, 'new': { 'Id': -1 }, 'arr': coll }
+                vm.platforms.selected = vm.platforms.new;
                 break;
             case "algoclass":
-                vm.algoclass = { 'selected': null, 'arr': coll }
+                vm.algoclass = { 'selected': null, 'new': { 'Id': -1 }, 'arr': coll }
+                vm.algoclass.selected = vm.algoclass.new;
                 break;
             case "algos":
-                vm.algos = { 'selected': null, 'arr': coll }
+                vm.algos = { 'selected': null, 'new': { 'Id': -1 }, 'arr': coll }
+                vm.algos.selected = vm.algos.new;
                 break;
             case "probclass":
-                vm.probclass = { 'selected': null, 'arr': coll }
+                vm.probclass = { 'selected': null, 'new': { 'Id': -1 }, 'arr': coll }
+                vm.probclass.selected = vm.probclass.new;
                 break;
             case "problems":
-                vm.problems = { 'selected': null, 'arr': coll }
+                vm.problems = { 'selected': null, 'new': { 'Id': -1 }, 'arr': coll }
+                vm.problems.selected = vm.problems.new;
                 break;
 
@@ -63,20 +78,25 @@
              case "platforms":
                  vm.currentData.name = "Platforms";
+                 vm.currentData.type = "ND";
                  vm.currentData.data = vm.platforms;
                  break;
              case "algoclass":
                  vm.currentData.name = "Algorithm classes";
+                 vm.currentData.type = "ND";
                  vm.currentData.data = vm.algoclass;
                  break;
              case "algos":
                  vm.currentData.name = "Algorithms";
+                 vm.currentData.type = "ALG";
                  vm.currentData.data = vm.algos;
                  break;
              case "probclass":
                  vm.currentData.name = "Problem classes";
+                 vm.currentData.type = "ND";
                  vm.currentData.data = vm.probclass;
                  break;
              case "problems":
                  vm.currentData.name = "Problems";
+                 vm.currentData.type = "PROB"
                  vm.currentData.data = vm.problems;
                  break;
@@ -84,3 +104,23 @@
          }
      }
+     vm.selectDataMember = function (index) {
+         if (index === null)
+             vm.currentData.data.selected = vm.currentData.data.new;
+         else {
+             vm.currentData.data.selected = vm.currentData.data.arr[index];
+         }
+     }
+     vm.saveCurrent = function () {
+         hubber.server.save(JSON.stringify(vm.currentData.data.selected), vm.currentData.name);
+     }
+     vm.deleteCurrent = function () {
+         hubber.server.delete(vm.currentData.data.selected.Id, vm.currentData.name);
+     }
+     vm.notify = function (text) {
+         $("#succText").html(text);
+         $("#success-alert").alert();
+         $("#success-alert").fadeTo(2000, 500).slideUp(500, function () {
+             $("#success-alert").hide();
+         });
+     }
 });
Index: /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Views/Job/OpenFile.cshtml
===================================================================
--- /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Views/Job/OpenFile.cshtml	(revision 13870)
+++ /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Views/Job/OpenFile.cshtml	(revision 13871)
@@ -252,5 +252,5 @@
             <li><a href="#finish"><i class="fa fa-flag-checkered"></i> Add to Hive or save to file</a></li>
             <li style="position:fixed">
-                <div class="alert alert-success" id="success-alert">
+                <div class="alert alert-success" id="success-alert" style="display:flex">
                     <span id="succText"></span>
                 </div>
Index: /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Views/OkbManagement/Index.cshtml
===================================================================
--- /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Views/OkbManagement/Index.cshtml	(revision 13870)
+++ /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Views/OkbManagement/Index.cshtml	(revision 13871)
@@ -4,10 +4,19 @@
 <div id="userId" style="display:none">@ViewBag.SessionId</div>
 <script src="~/js/hubs/okbmanagerhubber.js"></script>
-<div ng-app="wjmokbmanager" ng-controller="okbmanangerCtrl" id="controllerdiv" class="animated fadeIn">
+<div ng-app="wjmokbmanager" ng-controller="okbmanangerCtrl" id="controllerdiv" class="animated fadeIn" ng-init="init()">
 
 
     @Html.Partial("Navbar", new NavbarViewModel("OKBAdmin", Model.User))
-
-    @Html.Partial("_ErrorMessage", Model.message)
+    @if (ViewBag.Success != null && ViewBag.Success)
+    {
+
+        @Html.Partial("_SuccessMessage", Model.message)
+    }
+    else
+    {
+        @Html.Partial("_ErrorMessage", Model.message)
+
+    }
+    
 
     <ul class="nav nav-pills nav-justified">
@@ -15,7 +24,7 @@
         <li role="presentation"
             ng-class="{active: currentData.name === 'Platforms'}">
-                <a ng-click="selectDataCat('platforms')" href="">
-                    Platforms
-                </a>
+            <a ng-click="selectDataCat('platforms')" href="">
+                Platforms
+            </a>
         </li>
         <li role="presentation"
@@ -40,9 +49,255 @@
             ng-class="{active: currentData.name === 'Problems'}">
             <a ng-click="selectDataCat('problems')" href="">
-                PlatformsProblems
-            </a>
-        </li>
-
+                Problems
+            </a>
+        </li>
     </ul>
+    <div class="row animated fadeIn" style="padding:10px">
+        <div class="col-sm-4" ng-if="currentData.name != ''" style="padding-left:15px">
+            <div class="btn-group btn-group-justified btn-block"
+                 role="group" style="margin-bottom:-4px">
+                <a class="btn btn-info btn-lg disabled"
+                   style="width:6%;box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
+                            text-shadow:2px 2px black;">
+                    <i class="fa fa-list"></i> {{currentData.name}}
+                </a>
+                <a class="btn btn-success"
+                   ng-class="{active: currentData.data.selected.Id === -1}"
+                   style="box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
+                            text-shadow:2px 2px black;"
+                   ng-click="selectDataMember(null)">
+                    <i class="fa fa-plus-circle"></i>
+                </a>
+            </div>
+            <div class="btn-group-vertical btn-block">
+                <a class="btn btn-default"
+                   ng-repeat="dat in currentData.data.arr track by $index"
+                   ng-class="{active: currentData.data.selected.Id === dat.Id}"
+                   style="box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); overflow:hidden"
+                   ng-click="selectDataMember($index)">
+                    {{dat.Name}}
+                </a>
+            </div>
+        </div>
+        <!--NOTIFICATIONS-->
+        <div class="alert alert-success" id="success-alert" style="display:flex">
+            <span id="succText"></span>
+        </div>
+        <!--Panel-->
+        <div class="col-sm-8 animated fadeIn" ng-if="currentData.name != ''"
+             id="content"
+             style="padding:5px; padding-left:10px;">
+            <div class="panel panel-primary"
+                 style="border-width:2px!important;
+                        box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);">
+                <div class="panel-heading" style="padding:15px">
+                    <!--Title for new algo class and problem class-->
+                    <h1 ng-if="currentData.data.selected.Id === -1 && currentData.name.length >  11">Add new {{currentData.name.slice(0,-2) | lowercase}}</h1>
+                    <!--Title for new others-->
+                    <h1 ng-if="currentData.data.selected.Id === -1 && currentData.name.length < 11">Add new {{currentData.name.slice(0,-1) | lowercase}}</h1>
+                    <!--Title for existing member-->
+                    <h1 ng-if="currentData.data.selected.Id != -1"> {{currentData.data.selected.Name}}</h1>
+                </div>
+                <div class="panel-body" style="padding:10px">
+                    <div class="form-group" style="padding-bottom:30px">
+
+                        <label for="inpusername"
+                               class="col-sm-3 control-label">
+                            Name
+                        </label>
+                        <div class="col-sm-8">
+                            <input type="text"
+                                   class="form-control"
+                                   id="inpusername"
+                                   name="inpusername"
+                                   placeholder="Name"
+                                   ng-model="currentData.data.selected.Name">
+                        </div>
+                    </div>
+                    <div class="form-group">
+
+                        <label for="inpdesc"
+                               class="col-sm-3 control-label">
+                            Description
+                        </label>
+                        <div class="col-sm-8">
+                            <textarea style="resize:vertical"
+                                      class="form-control"
+                                      id="inpdesc"
+                                      name="inpdesc"
+                                      placeholder="Description"
+                                      ng-model="currentData.data.selected.Description"></textarea>
+                        </div>
+
+                    </div>
+                    <!-- PLATFORM-->
+                    <div class="form-group"
+                         style="padding-top:30px"
+                         ng-if="currentData.type != 'ND'">
+
+                        <label for="inpplat"
+                               class="col-sm-3 control-label">
+                            Platform
+                        </label>
+                        <div class="col-sm-8">
+                            <select class="form-control"
+                                    id="inpplat"
+                                    name="inpplat"
+                                    ng-model="currentData.data.selected.PlatformId"
+                                    ng-options="plat.Id as plat.Name for plat in platforms.arr"></select>
+                        </div>
+
+                    </div>
+                    <!--ALGO CLASS-->
+                    <div class="form-group"
+                         style="padding-top:30px"
+                         ng-if="currentData.type === 'ALG'">
+                        <label for="inpplat"
+                               class="col-sm-3 control-label">
+                            Algorithm Class
+                        </label>
+                        <div class="col-sm-8">
+                            <select class="form-control"
+                                    id="inpplat"
+                                    name="inpplat"
+                                    ng-model="currentData.data.selected.AlgorithmClassId"
+                                    ng-options="alg.Id as alg.Name for alg in algoclass.arr"></select>
+                        </div>
+
+                    </div>
+                    <!--PROBLEM CLASS-->
+                    <div class="form-group"
+                         style="padding-top:30px"
+                         ng-if="currentData.type === 'PROB'">
+                        <label for="inpplat"
+                               class="col-sm-3 control-label">
+                            Problem Class
+                        </label>
+                        <div class="col-sm-8">
+                            <select class="form-control"
+                                    id="inpplat"
+                                    name="inpplat"
+                                    ng-model="currentData.data.selected.ProblemClassId"
+                                    ng-options="prob.Id as prob.Name for prob in probclass.arr"></select>
+                        </div>
+
+                    </div>
+                    <!--DATA TYPE-->
+
+                </div>
+                <div class="panel-body"
+                     ng-if="currentData.data.selected.Id != -1">
+                    <div class="row" ng-if="currentData.type != 'ND'" style="padding:20px;padding-top:0">
+                        <h3>Data type</h3>
+                        <div class="form-group"
+                             style="padding-top:10px">
+                            <label class="col-sm-3 control-label">
+                                Name
+                            </label>
+                            <div class="col-sm-8">
+                                <input type="text"
+                                       class="form-control"
+                                       disabled
+                                       ng-model="currentData.data.selected.DataTypeName">
+                            </div>
+
+                        </div>
+                        <div class="form-group"
+                             style="padding-top:30px">
+                            <label class="col-sm-3 control-label">
+                                Type Name
+                            </label>
+                            <div class="col-sm-8">
+                                <input type="text"
+                                       class="form-control"
+                                       disabled
+                                       ng-model="currentData.data.selected.DataTypeTypeName">
+                            </div>
+
+                        </div>
+                    </div>
+                    <form method="post"
+                          asp-action="Uploader"
+                          asp-controller="OkbManagement" enctype="multipart/form-data">
+                        <input onchange="printFile()"
+                               type="file"
+                               id="fileupl"
+                               name="fileupl"
+                               accept=".hl"
+                               style="display:none" />
+                        <div onclick="firefilebutton()"
+                             class="btn btn-info"
+                             id="uplbutt"
+                             style="box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
+                                 text-shadow:1px 1px black;">
+                            <i class="fa fa-folder-open-o"></i> Choose new file
+                        </div>
+
+                        <input type="submit" class="btn btn-primary" id="upl" disabled value="Upload" />
+                        <input type="text"
+                               id="name"
+                               name="name"
+                               value="{{currentData.name }}"
+                               style="display:none" />
+                        <input type="text"
+                               id="id"
+                               name="id"
+                               value="{{currentData.data.selected.Id }}"
+                               style="display:none" />
+                        <script type="text/javascript">
+                            function firefilebutton() {
+                                document.getElementById("fileupl").click();
+
+
+                            }
+                            function printFile() {
+                                var files = document.getElementById("fileupl").files;
+                                if (files.length > 0) {
+                                    document.getElementById("upl").disabled = false;
+
+                                    for (var i = 0; i < files.length; i++) {
+                                        document.getElementById("uplbutt").innerHTML =  files[i].name + " selected";
+                                    }
+                                }
+                            }
+
+
+                        </script>
+                    </form>
+                </div>
+                <div class="panel-footer" style="height:60px">
+                    <div class="col-sm-3">
+                        <a class="btn btn-success btn-block"
+                           style="box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
+                            text-shadow:2px 2px black;"
+                           ng-if="currentData.data.selected.Id != -1"
+                           ng-click="saveCurrent()">
+                            <i class="fa fa-save"></i> Save
+                        </a>
+                        <a class="btn btn-success btn-block"
+                           style="box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
+                            text-shadow:2px 2px black;"
+                           ng-if="currentData.data.selected.Id === -1"
+                           ng-click="saveCurrent()">
+                            <i class="fa  fa-plus-circle"></i> Add
+                        </a>
+                    </div>
+                    <div class="col-sm-offset-6 col-sm-3">
+                        <a class="btn btn-danger btn-block"
+                           style="box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
+                            text-shadow:2px 2px black;"
+                           ng-if="currentData.data.selected.Id != -1"
+                           ng-click="deleteCurrent()">
+                            <i class="fa fa-trash-o"></i> Delete
+                        </a>
+                    </div>
+                </div>
+
+
+
+            </div>
+        </div>
+
+    </div>
 
     <script type="text/javascript">
Index: /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Views/Query/Index.cshtml
===================================================================
--- /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Views/Query/Index.cshtml	(revision 13870)
+++ /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Views/Query/Index.cshtml	(revision 13871)
@@ -39,5 +39,5 @@
                 {{item.Label}}
             </p>
-            <span ng-if="item.CompareType != 'HeuristicLab.Clients.OKB.Query.EqualityComparison'">
+            <span ng-if="item.CompareType != 'HeuristicLab.Clients.OKB.Query.EqualityComparison'" style="margin-left:10px">
                 <select class="col-md-2"
                         name="comparisonSelect"
@@ -50,5 +50,5 @@
                     </option>
                 </select>
-                <select class="col-md-4" ng-if="item.AvailableValues != undefined" name="Values" ng-model="item.Value">
+                <select class="col-md-4 col-sm-10" ng-if="item.AvailableValues != undefined" name="Values" ng-model="item.Value" style="margin-left:10px">
                     <option ng-repeat="val in item.AvailableValues" value="{{val}}">{{val}}</option>
                 </select>
Index: /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Views/Shared/_SuccessMessage.cshtml
===================================================================
--- /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Views/Shared/_SuccessMessage.cshtml	(revision 13871)
+++ /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Views/Shared/_SuccessMessage.cshtml	(revision 13871)
@@ -0,0 +1,7 @@
+﻿@model String
+@if (Model != null && Model != "")
+{
+    <div class="row" style="text-align:center">
+        <h4 style="padding-bottom:0;margin-bottom:0"><span style="" class="label label-success">@Model</span></h4>
+
+    </div>}
Index: /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/wwwroot/.bowerrc
===================================================================
--- /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/wwwroot/.bowerrc	(revision 13871)
+++ /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/wwwroot/.bowerrc	(revision 13871)
@@ -0,0 +1,3 @@
+{
+  "directory": "wwwroot/lib"
+}
Index: /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/wwwroot/js/hubs/okbmanagerhubber.js
===================================================================
--- /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/wwwroot/js/hubs/okbmanagerhubber.js	(revision 13870)
+++ /branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/wwwroot/js/hubs/okbmanagerhubber.js	(revision 13871)
@@ -22,5 +22,7 @@
     var vm = $scope;
     var hubber = $.connection.okbManagerHub;
-    vm.currentData = {'name' : '', 'data' : null}
+   $("#success-alert").hide();
+
+    vm.currentData = {'name' : '','type': '' , 'data' : null}
 
     vm.init = function () {
@@ -29,10 +31,18 @@
         $.connection.hub.qs = { 'userid': uid };
         //Connection string set to identify the unique session ID for the user
-        $.connection.hub.start().done(function () {
-           // hubber.server.requestInfo();//initial data request
-        });
-        hubber.client.processData = function (filters) {
-
+        $.connection.hub.start().done();
+        hubber.client.deleteComplete = function (text) {
+            vm.notify(text);
+            $scope.$apply();
         };
+        hubber.client.saveComplete = function (text) {
+            vm.notify(text);
+            $scope.$apply();
+        }
+        hubber.client.refreshData = function ( name, json) {
+            vm.initData(JSON.parse(json), name);
+            vm.selectDataCat(name); 
+            $scope.$apply();
+        }
 
     }
@@ -41,17 +51,22 @@
         switch (name) {
             case "platforms":
-                vm.platforms = {'selected' : null, 'arr' : coll}
+                vm.platforms = { 'selected': null, 'new': { 'Id': -1 }, 'arr': coll }
+                vm.platforms.selected = vm.platforms.new;
                 break;
             case "algoclass":
-                vm.algoclass = { 'selected': null, 'arr': coll }
+                vm.algoclass = { 'selected': null, 'new': { 'Id': -1 }, 'arr': coll }
+                vm.algoclass.selected = vm.algoclass.new;
                 break;
             case "algos":
-                vm.algos = { 'selected': null, 'arr': coll }
+                vm.algos = { 'selected': null, 'new': { 'Id': -1 }, 'arr': coll }
+                vm.algos.selected = vm.algos.new;
                 break;
             case "probclass":
-                vm.probclass = { 'selected': null, 'arr': coll }
+                vm.probclass = { 'selected': null, 'new': { 'Id': -1 }, 'arr': coll }
+                vm.probclass.selected = vm.probclass.new;
                 break;
             case "problems":
-                vm.problems = { 'selected': null, 'arr': coll }
+                vm.problems = { 'selected': null, 'new': { 'Id': -1 }, 'arr': coll }
+                vm.problems.selected = vm.problems.new;
                 break;
 
@@ -63,20 +78,25 @@
              case "platforms":
                  vm.currentData.name = "Platforms";
+                 vm.currentData.type = "ND";
                  vm.currentData.data = vm.platforms;
                  break;
              case "algoclass":
                  vm.currentData.name = "Algorithm classes";
+                 vm.currentData.type = "ND";
                  vm.currentData.data = vm.algoclass;
                  break;
              case "algos":
                  vm.currentData.name = "Algorithms";
+                 vm.currentData.type = "ALG";
                  vm.currentData.data = vm.algos;
                  break;
              case "probclass":
                  vm.currentData.name = "Problem classes";
+                 vm.currentData.type = "ND";
                  vm.currentData.data = vm.probclass;
                  break;
              case "problems":
                  vm.currentData.name = "Problems";
+                 vm.currentData.type = "PROB"
                  vm.currentData.data = vm.problems;
                  break;
@@ -84,3 +104,23 @@
          }
      }
+     vm.selectDataMember = function (index) {
+         if (index === null)
+             vm.currentData.data.selected = vm.currentData.data.new;
+         else {
+             vm.currentData.data.selected = vm.currentData.data.arr[index];
+         }
+     }
+     vm.saveCurrent = function () {
+         hubber.server.save(JSON.stringify(vm.currentData.data.selected), vm.currentData.name);
+     }
+     vm.deleteCurrent = function () {
+         hubber.server.delete(vm.currentData.data.selected.Id, vm.currentData.name);
+     }
+     vm.notify = function (text) {
+         $("#succText").html(text);
+         $("#success-alert").alert();
+         $("#success-alert").fadeTo(2000, 500).slideUp(500, function () {
+             $("#success-alert").hide();
+         });
+     }
 });
Index: /branches/WebJobManager/HeuristicLab.Clients.Hive/3.3/Util/PersistenceUtil.cs
===================================================================
--- /branches/WebJobManager/HeuristicLab.Clients.Hive/3.3/Util/PersistenceUtil.cs	(revision 13870)
+++ /branches/WebJobManager/HeuristicLab.Clients.Hive/3.3/Util/PersistenceUtil.cs	(revision 13871)
@@ -20,34 +20,42 @@
 #endregion
 
+using HeuristicLab.Persistence.Core;
+using HeuristicLab.Persistence.Default.Xml;
 using System;
 using System.Collections.Generic;
 using System.IO;
-using HeuristicLab.Persistence.Core;
-using HeuristicLab.Persistence.Default.Xml;
 
-namespace HeuristicLab.Clients.Hive {
-  public static class PersistenceUtil {
-    public static byte[] Serialize(object obj, out IEnumerable<Type> types) {
-      using (MemoryStream memStream = new MemoryStream()) {
-        XmlGenerator.Serialize(obj, memStream, ConfigurationService.Instance.GetConfiguration(new XmlFormat()), false, out types);
-        byte[] jobByteArray = memStream.ToArray();
-        return jobByteArray;
-      }
+namespace HeuristicLab.Clients.Hive
+{
+    public static class PersistenceUtil
+    {
+        public static byte[] Serialize(object obj, out IEnumerable<Type> types)
+        {
+            using (MemoryStream memStream = new MemoryStream())
+            {
+                XmlGenerator.Serialize(obj, memStream, ConfigurationService.Instance.GetConfiguration(new XmlFormat()), false, out types);
+                byte[] jobByteArray = memStream.ToArray();
+                return jobByteArray;
+            }
+        }
+
+        public static byte[] Serialize(object obj)
+        {
+            using (MemoryStream memStream = new MemoryStream())
+            {
+                XmlGenerator.Serialize(obj, memStream);
+                byte[] jobByteArray = memStream.ToArray();
+                return jobByteArray;
+            }
+        }
+
+        public static T Deserialize<T>(byte[] sjob)
+        {
+            using (MemoryStream memStream = new MemoryStream(sjob))
+            {
+                T job = XmlParser.Deserialize<T>(memStream, CompressionType.Zip);
+                return job;
+            }
+        }
     }
-
-    public static byte[] Serialize(object obj) {
-      using (MemoryStream memStream = new MemoryStream()) {
-        XmlGenerator.Serialize(obj, memStream);
-        byte[] jobByteArray = memStream.ToArray();
-        return jobByteArray;
-      }
-    }
-
-    public static T Deserialize<T>(byte[] sjob) {
-      using (MemoryStream memStream = new MemoryStream(sjob)) {
-        T job = XmlParser.Deserialize<T>(memStream);
-        return job;
-      }
-    }
-  }
 }
