diff --git a/apps/dnet-is-application/src/main/java/eu/dnetlib/is/resources/ResourcesRestController.java b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/resources/ResourcesRestController.java
new file mode 100644
index 00000000..fae5ebd2
--- /dev/null
+++ b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/resources/ResourcesRestController.java
@@ -0,0 +1,6 @@
+package eu.dnetlib.is.resources;
+
+
+public class ResourcesRestController {
+
+}
diff --git a/apps/dnet-is-application/src/main/java/eu/dnetlib/is/resources/ResourcesUIController.java b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/resources/ResourcesUIController.java
new file mode 100644
index 00000000..bfd58609
--- /dev/null
+++ b/apps/dnet-is-application/src/main/java/eu/dnetlib/is/resources/ResourcesUIController.java
@@ -0,0 +1,29 @@
+package eu.dnetlib.is.resources;
+
+import java.util.stream.Collectors;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import eu.dnetlib.is.resource.model.SimpleResourceType;
+import eu.dnetlib.is.resource.repository.SimpleResourceTypeRepository;
+
+@Controller
+public class ResourcesUIController {
+
+ @Autowired
+ private SimpleResourceTypeRepository simpleResourceTypeRepository;
+
+ @GetMapping("/simpleResources")
+ public void simpleResources(@RequestParam final String type, final ModelMap map) {
+ map.addAttribute("type", type);
+ map.addAttribute("types", simpleResourceTypeRepository.findAll()
+ .stream()
+ .map(SimpleResourceType::getType)
+ .sorted()
+ .collect(Collectors.toList()));
+ }
+}
diff --git a/apps/dnet-is-application/src/main/resources/static/js/simpleResources.js b/apps/dnet-is-application/src/main/resources/static/js/simpleResources.js
new file mode 100644
index 00000000..f335efef
--- /dev/null
+++ b/apps/dnet-is-application/src/main/resources/static/js/simpleResources.js
@@ -0,0 +1,65 @@
+var app = angular.module('resourcesApp', []);
+
+app.controller('resourcesController', function($scope, $http) {
+ $scope.resources = [];
+ $scope.tmpRes = {};
+ $scope.mode = '';
+
+ $scope.reload = function() {
+ $http.get('./api/resources/?' + $.now()).then(function successCallback(res) {
+ $scope.resources = res.data;
+ }, function errorCallback(res) {
+ alert('ERROR: ' + res.data.message);
+ });
+ };
+
+ $scope.prepareNewRes = function() {
+ $scope.mode = 'new';
+ $scope.tmpRes = {
+ 'id' : '',
+ 'name' : '',
+ 'description' : ''
+ };
+ }
+
+ $scope.prepareEditRes = function(res) {
+ $scope.mode = 'edit';
+ $scope.tmpRes = angular.copy(res);
+ }
+
+ $scope.saveResource = function(res) {
+ if ($scope.mode == 'new') {
+ var found = false;
+
+ angular.forEach($scope.resources, function(r) {
+ if (res.id == r.id) { found = true; };
+ });
+
+ if (found) {
+ alert("Insertion failed: resource already exists !");
+ return;
+ }
+ }
+
+ $http.defaults.headers.post["Content-Type"] = "application/json;charset=UTF-8";
+ $http.post('./api/resources/?' + $.now(), res).then(function successCallback(res) {
+ $scope.resources = res.data;
+ alert("Resource saved");
+ }, function errorCallback(res) {
+ alert('ERROR: ' + res.data.message);
+ });
+ };
+
+ $scope.deleteResource = function(id) {
+ if (confirm("Are you sure ?")) {
+ $http.delete('./api/resources/' + encodeURIComponent(id) + '?' + $.now()).then(function successCallback(res) {
+ $scope.resources = res.data;
+ alert("Resource deleted");
+ }, function errorCallback(res) {
+ alert('ERROR: ' + res.data.message);
+ });
+ }
+ };
+
+ $scope.reload();
+});
diff --git a/apps/dnet-is-application/src/main/resources/templates/fragments/mainParts.html b/apps/dnet-is-application/src/main/resources/templates/fragments/mainParts.html
index b94c1d9b..d3952ae7 100644
--- a/apps/dnet-is-application/src/main/resources/templates/fragments/mainParts.html
+++ b/apps/dnet-is-application/src/main/resources/templates/fragments/mainParts.html
@@ -33,7 +33,8 @@
diff --git a/apps/dnet-is-application/src/main/resources/templates/simpleResources.html b/apps/dnet-is-application/src/main/resources/templates/simpleResources.html
new file mode 100644
index 00000000..cf60a14d
--- /dev/null
+++ b/apps/dnet-is-application/src/main/resources/templates/simpleResources.html
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Number of resources: {{(resources | filter:resFilter).length}}
+
+
+
+
+ ID |
+ Name |
+ Description |
+ |
+
+
+
+
+ no resources |
+
+
+ {{r.id}} |
+ {{r.name}} |
+ {{r.description}} |
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libs/dnet-is-common/src/main/java/eu/dnetlib/is/resource/model/SimpleResource.java b/libs/dnet-is-common/src/main/java/eu/dnetlib/is/resource/model/SimpleResource.java
new file mode 100644
index 00000000..2513a3bd
--- /dev/null
+++ b/libs/dnet-is-common/src/main/java/eu/dnetlib/is/resource/model/SimpleResource.java
@@ -0,0 +1,77 @@
+package eu.dnetlib.is.resource.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+@Entity
+@Table(name = "resources")
+public class SimpleResource implements Serializable {
+
+ private static final long serialVersionUID = -5339095932018797315L;
+
+ @Id
+ @Column(name = "id")
+ private String id;
+
+ @Column(name = "name")
+ private String name;
+
+ @Column(name = "description")
+ private String description;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ @Column(name = "creation_date")
+ private Date creationDate;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ @Column(name = "modification_date")
+ private Date modificationDate;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(final String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(final String description) {
+ this.description = description;
+ }
+
+ public Date getCreationDate() {
+ return creationDate;
+ }
+
+ public void setCreationDate(final Date creationDate) {
+ this.creationDate = creationDate;
+ }
+
+ public Date getModificationDate() {
+ return modificationDate;
+ }
+
+ public void setModificationDate(final Date modificationDate) {
+ this.modificationDate = modificationDate;
+ }
+
+}
diff --git a/libs/dnet-is-common/src/main/java/eu/dnetlib/is/resource/model/SimpleResourceType.java b/libs/dnet-is-common/src/main/java/eu/dnetlib/is/resource/model/SimpleResourceType.java
new file mode 100644
index 00000000..e08c82af
--- /dev/null
+++ b/libs/dnet-is-common/src/main/java/eu/dnetlib/is/resource/model/SimpleResourceType.java
@@ -0,0 +1,27 @@
+package eu.dnetlib.is.resource.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "resource_types")
+public class SimpleResourceType implements Serializable {
+
+ private static final long serialVersionUID = -152368127918595773L;
+
+ @Id
+ @Column(name = "type")
+ private String type;
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(final String type) {
+ this.type = type;
+ }
+}
diff --git a/libs/dnet-is-common/src/main/java/eu/dnetlib/is/resource/repository/SimpleResourceRepository.java b/libs/dnet-is-common/src/main/java/eu/dnetlib/is/resource/repository/SimpleResourceRepository.java
new file mode 100644
index 00000000..5a537584
--- /dev/null
+++ b/libs/dnet-is-common/src/main/java/eu/dnetlib/is/resource/repository/SimpleResourceRepository.java
@@ -0,0 +1,17 @@
+package eu.dnetlib.is.resource.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import eu.dnetlib.is.resource.model.SimpleResource;
+
+public interface SimpleResourceRepository extends JpaRepository {
+
+ @Query(value = "select content from resources where id = :id", nativeQuery = true)
+ String getContentById(String id);
+
+ @Modifying
+ @Query(value = "update resources set content = :content where id = :id", nativeQuery = true)
+ String setContentById(String id, String content);
+}
diff --git a/libs/dnet-is-common/src/main/java/eu/dnetlib/is/resource/repository/SimpleResourceTypeRepository.java b/libs/dnet-is-common/src/main/java/eu/dnetlib/is/resource/repository/SimpleResourceTypeRepository.java
new file mode 100644
index 00000000..1936ee59
--- /dev/null
+++ b/libs/dnet-is-common/src/main/java/eu/dnetlib/is/resource/repository/SimpleResourceTypeRepository.java
@@ -0,0 +1,9 @@
+package eu.dnetlib.is.resource.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import eu.dnetlib.is.resource.model.SimpleResourceType;
+
+public interface SimpleResourceTypeRepository extends JpaRepository {
+
+}
diff --git a/libs/dnet-is-common/src/main/resources/sql/schema.sql b/libs/dnet-is-common/src/main/resources/sql/schema.sql
index fb92a324..f3b72c14 100644
--- a/libs/dnet-is-common/src/main/resources/sql/schema.sql
+++ b/libs/dnet-is-common/src/main/resources/sql/schema.sql
@@ -76,4 +76,19 @@ CREATE TABLE wf_history (
ds_name text,
ds_api text,
details jsonb
-);
\ No newline at end of file
+);
+
+-- Other Resources
+
+CREATE TABLE resource_types(type text PRIMARY KEY);
+INSERT INTO resource_types(type) VALUES ('transformation_rule'), ('cleaning_rule');
+
+CREATE TABLE resources (
+ id text PRIMARY KEY,
+ name text NOT NULL,
+ description text,
+ content text NOT NULL,
+ type text NOT NULL REFERENCES resource_types(type),
+ creation_date timestamp NOT NULL DEFAULT now(),
+ modification_date timestamp NOT NULL DEFAULT now()
+);