diff --git a/src/main/java/no/nibio/vips/logic/VIPSLogicApplication.java b/src/main/java/no/nibio/vips/logic/VIPSLogicApplication.java
index 856d321bedd68f7e36b34bb4ea1cccf77d4f4d8a..bf95d87cb7125c4dee28dc803170715d617b5e8b 100755
--- a/src/main/java/no/nibio/vips/logic/VIPSLogicApplication.java
+++ b/src/main/java/no/nibio/vips/logic/VIPSLogicApplication.java
@@ -25,7 +25,7 @@ import javax.ws.rs.core.Application;
 
 /**
  * Responsible for adding REST resources
- * @copyright 2016-2021 {@link http://www.nibio.no NIBIO}
+ * @copyright 2016-2021 {@link https://www.nibio.no NIBIO}
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 @ApplicationPath("/rest/")
@@ -69,8 +69,7 @@ public class VIPSLogicApplication extends Application
      * given list with all resources defined in the project.
      */
     private void addRestResourceClasses(Set<Class<?>> resources) {
-        resources.add(com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider.class);
-        resources.add(com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider.class);
+
         resources.add(com.webcohesion.enunciate.rt.EnunciateJaxbContextResolver.class);
         resources.add(no.nibio.vips.logic.messaging.sms.SMSHandlingService.class);
         resources.add(no.nibio.vips.logic.modules.applefruitmoth.AppleFruitMothService.class);
diff --git a/src/main/java/no/nibio/vips/logic/entity/CropCategory.java b/src/main/java/no/nibio/vips/logic/entity/CropCategory.java
index b4c31d5a166d4b07fee65dd2b3f724bbba09db74..dcaea235487d93194c376aa2a6a934dd568241f3 100755
--- a/src/main/java/no/nibio/vips/logic/entity/CropCategory.java
+++ b/src/main/java/no/nibio/vips/logic/entity/CropCategory.java
@@ -39,8 +39,6 @@ import javax.validation.constraints.Size;
 import javax.xml.bind.annotation.XmlRootElement;
 import no.nibio.vips.logic.util.IntegerArrayUserType;
 import org.hibernate.annotations.Type;
-import org.hibernate.annotations.TypeDef;
-import org.hibernate.annotations.TypeDefs;
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
@@ -49,7 +47,6 @@ import org.hibernate.annotations.TypeDefs;
 @Entity
 @Table(name = "crop_category")
 @XmlRootElement
-@TypeDefs( {@TypeDef( name= "IntegerArray", typeClass = IntegerArrayUserType.class)})
 @NamedQueries({
     @NamedQuery(name = "CropCategory.findAll", query = "SELECT c FROM CropCategory c"),
     @NamedQuery(name = "CropCategory.findByCropCategoryId", query = "SELECT c FROM CropCategory c WHERE c.cropCategoryId = :cropCategoryId"),
@@ -71,7 +68,7 @@ public class CropCategory implements Serializable {
     private String defaultName;
     @OneToMany(cascade = CascadeType.ALL, mappedBy = "cropCategoryId", fetch = FetchType.EAGER)
     private Set<CropCategoryLocal> cropCategoryLocalSet;
-    @Type(type = "IntegerArray")
+    @Type(IntegerArrayUserType.class)
     @Column(name = "crop_organism_ids")
     private Integer[] cropOrganismIds;
     @Column(name = "organization_id")
diff --git a/src/main/java/no/nibio/vips/logic/entity/CropPest.java b/src/main/java/no/nibio/vips/logic/entity/CropPest.java
index c8250cdd1b3b4eec9e248140bd2229209c2b3d92..7b72b1711495e0b5492cd1b503bb1147aedf2211 100755
--- a/src/main/java/no/nibio/vips/logic/entity/CropPest.java
+++ b/src/main/java/no/nibio/vips/logic/entity/CropPest.java
@@ -31,8 +31,6 @@ import javax.validation.constraints.NotNull;
 import javax.xml.bind.annotation.XmlRootElement;
 import no.nibio.vips.logic.util.IntegerArrayUserType;
 import org.hibernate.annotations.Type;
-import org.hibernate.annotations.TypeDef;
-import org.hibernate.annotations.TypeDefs;
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
@@ -40,7 +38,6 @@ import org.hibernate.annotations.TypeDefs;
  */
 @Entity
 @Table(name = "crop_pest")
-@TypeDefs( {@TypeDef( name= "IntegerArray", typeClass = IntegerArrayUserType.class)})
 @XmlRootElement
 @NamedQueries({
     @NamedQuery(name = "CropPest.findAll", query = "SELECT c FROM CropPest c"),
@@ -56,7 +53,7 @@ public class CropPest implements Serializable {
     @NotNull
     @Column(name = "crop_organism_id")
     private Integer cropOrganismId;
-    @Type(type = "IntegerArray")
+    @Type(IntegerArrayUserType.class)
     @Column(name = "pest_organism_ids")
     private Integer[] pestOrganismIds;
     @Column(name = "include_all_child_crops")
diff --git a/src/main/java/no/nibio/vips/logic/entity/ForecastConfiguration.java b/src/main/java/no/nibio/vips/logic/entity/ForecastConfiguration.java
index b00ec4228136472734f9508e77187db820776b47..6b800a1586ddaa5007d4d5b89b0e7e1a9e6a4dbf 100755
--- a/src/main/java/no/nibio/vips/logic/entity/ForecastConfiguration.java
+++ b/src/main/java/no/nibio/vips/logic/entity/ForecastConfiguration.java
@@ -47,8 +47,6 @@ import javax.persistence.Transient;
 import no.nibio.vips.logic.util.IntegerArrayUserType;
 import no.nibio.vips.util.WeatherUtil;
 import org.hibernate.annotations.Type;
-import org.hibernate.annotations.TypeDef;
-import org.hibernate.annotations.TypeDefs;
 
 /**
  * @copyright 2014-2016 <a href="http://www.nibio.no/">NIBIO</a>
@@ -57,7 +55,6 @@ import org.hibernate.annotations.TypeDefs;
 @Entity
 @Table(name = "forecast_configuration")
 @XmlRootElement
-@TypeDefs( {@TypeDef( name= "IntegerArray", typeClass = IntegerArrayUserType.class)})
 @NamedQueries({
     @NamedQuery(name = "ForecastConfiguration.findAll", query = "SELECT f FROM ForecastConfiguration f WHERE f.isPrivate = FALSE"),
     @NamedQuery(name = "ForecastConfiguration.findByForecastConfigurationId", query = "SELECT f FROM ForecastConfiguration f WHERE f.forecastConfigurationId = :forecastConfigurationId"),
@@ -125,7 +122,7 @@ public class ForecastConfiguration implements Serializable, Comparable {
     @Column(name = "is_private")
     private Boolean isPrivate;
     
-    @Type(type = "IntegerArray")
+    @Type(IntegerArrayUserType.class)
     @Column(name = "grid_weather_station_point_of_interest_ids")
     private Integer[] gridWeatherStationPointOfInterestIds;
     
@@ -288,7 +285,7 @@ public class ForecastConfiguration implements Serializable, Comparable {
     }
 
     /**
-     * @param organismiId the organismiId to set
+     * @param cropOrganismId the organismiId to set
      */
     public void setCropOrganismId(Organism cropOrganismId) {
         this.cropOrganismId = cropOrganismId;
diff --git a/src/main/java/no/nibio/vips/logic/entity/Message.java b/src/main/java/no/nibio/vips/logic/entity/Message.java
index 4003789ab76c60fb7a18fd50ee0cc91cf5409147..566c2bf37b954a9efaef753a774cc82422fa7eec 100755
--- a/src/main/java/no/nibio/vips/logic/entity/Message.java
+++ b/src/main/java/no/nibio/vips/logic/entity/Message.java
@@ -46,8 +46,6 @@ import javax.persistence.Transient;
 import javax.xml.bind.annotation.XmlRootElement;
 import no.nibio.vips.logic.util.IntegerArrayUserType;
 import org.hibernate.annotations.Type;
-import org.hibernate.annotations.TypeDef;
-import org.hibernate.annotations.TypeDefs;
 
 /**
  * @copyright 2014 <a href="http://www.nibio.no/">NIBIO</a>
@@ -56,7 +54,6 @@ import org.hibernate.annotations.TypeDefs;
 @Entity
 @Table(name = "message")
 @XmlRootElement
-@TypeDefs( {@TypeDef( name= "IntegerArray", typeClass = IntegerArrayUserType.class)})
 @NamedQueries({
     @NamedQuery(name = "Message.findAll", query = "SELECT m FROM Message m"),
     @NamedQuery(name = "Message.findByMessageId", query = "SELECT m FROM Message m WHERE m.messageId = :messageId"),
@@ -277,7 +274,7 @@ public class Message implements Serializable {
     /**
      * @return the cropCategoryIds
      */
-    @Type(type = "IntegerArray")
+    @Type(IntegerArrayUserType.class)
     @Column(name="crop_category_ids")
     public Integer[] getCropCategoryIds() {
         return cropCategoryIds;
diff --git a/src/main/java/no/nibio/vips/logic/entity/Observation.java b/src/main/java/no/nibio/vips/logic/entity/Observation.java
index d34522ac17e7bb69a2f4955fd339d0c5dd5798d7..6f50d16bfd1e4aaec7a9a2fb97c79540e2413597 100755
--- a/src/main/java/no/nibio/vips/logic/entity/Observation.java
+++ b/src/main/java/no/nibio/vips/logic/entity/Observation.java
@@ -52,8 +52,6 @@ import no.nibio.vips.logic.entity.rest.ObservationListItem;
 import no.nibio.vips.logic.util.StringJsonUserType;
 import no.nibio.vips.observationdata.ObservationDataSchema;
 import org.hibernate.annotations.Type;
-import org.hibernate.annotations.TypeDef;
-import org.hibernate.annotations.TypeDefs;
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
@@ -62,7 +60,6 @@ import org.hibernate.annotations.TypeDefs;
 @Entity
 @Table(name = "observation")
 @XmlRootElement
-@TypeDefs( {@TypeDef( name= "StringJsonObject", typeClass = StringJsonUserType.class)})
 @NamedQueries({
     @NamedQuery(name = "Observation.findAll", query = "SELECT o FROM Observation o"),
     @NamedQuery(name = "Observation.findByObservationId", query = "SELECT o FROM Observation o WHERE o.observationId = :observationId"),
@@ -438,7 +435,7 @@ public class Observation implements Serializable, no.nibio.vips.observation.Obse
     /**
      * @return the observationData
      */
-    @Type(type = "StringJsonObject")
+    @Type(StringJsonUserType.class)
     @Column(name = "observation_data")
     @Override
     public String getObservationData() {
diff --git a/src/main/java/no/nibio/vips/logic/entity/UserUuidPK.java b/src/main/java/no/nibio/vips/logic/entity/UserUuidPK.java
index b5a634dd94fa955ed175babd2b9392fa4c58201c..e0363d1b4ba8148df04c213354a1eb5cb230ad3f 100755
--- a/src/main/java/no/nibio/vips/logic/entity/UserUuidPK.java
+++ b/src/main/java/no/nibio/vips/logic/entity/UserUuidPK.java
@@ -35,7 +35,6 @@ public class UserUuidPK implements Serializable {
     @Basic(optional = false)
     @NotNull
     @Column(name = "user_uuid")
-    @org.hibernate.annotations.Type(type="pg-uuid") // Ugly implementation specific hack
     private UUID userUuid;
     @Basic(optional = false)
     @NotNull
diff --git a/src/main/java/no/nibio/vips/logic/messaging/ForecastEventNotificationSubscription.java b/src/main/java/no/nibio/vips/logic/messaging/ForecastEventNotificationSubscription.java
index 90dfb547c58da6967fabc5882e5ee6d3247fba46..eab276aa79d05385f5378e0d60893499cb1e6d7f 100755
--- a/src/main/java/no/nibio/vips/logic/messaging/ForecastEventNotificationSubscription.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/ForecastEventNotificationSubscription.java
@@ -27,8 +27,6 @@ import javax.persistence.Id;
 import javax.persistence.Table;
 import no.nibio.vips.logic.util.IntegerArrayUserType;
 import org.hibernate.annotations.Type;
-import org.hibernate.annotations.TypeDef;
-import org.hibernate.annotations.TypeDefs;
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
@@ -36,7 +34,6 @@ import org.hibernate.annotations.TypeDefs;
  */
 @Entity
 @Table(name = "forecast_event_notification_subscription", schema = "messaging")
-@TypeDefs( {@TypeDef( name= "IntegerArray", typeClass = IntegerArrayUserType.class)})
 public class ForecastEventNotificationSubscription {
 
     @Id
@@ -47,11 +44,11 @@ public class ForecastEventNotificationSubscription {
     @Column(name = "universal_message_format_id")
     private Integer universalMessageFormatId;
     
-    @Type(type = "IntegerArray")
+    @Type(IntegerArrayUserType.class)
     @Column(name = "weather_station_ids")
     private Integer[] weatherStationIds;
     
-    @Type(type = "IntegerArray")
+    @Type(IntegerArrayUserType.class)
     @Column(name = "crop_category_ids")
     private Integer[] cropCategoryIds;
 
diff --git a/src/main/java/no/nibio/vips/logic/messaging/MessageNotificationSubscription.java b/src/main/java/no/nibio/vips/logic/messaging/MessageNotificationSubscription.java
index f56bae330be54cdf3169f9175f7daf651c132636..7bb4a8b1e5a84248cc65ebdcd6221a2f0802f279 100755
--- a/src/main/java/no/nibio/vips/logic/messaging/MessageNotificationSubscription.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/MessageNotificationSubscription.java
@@ -28,8 +28,6 @@ import javax.persistence.Id;
 import javax.persistence.Table;
 import no.nibio.vips.logic.util.IntegerArrayUserType;
 import org.hibernate.annotations.Type;
-import org.hibernate.annotations.TypeDef;
-import org.hibernate.annotations.TypeDefs;
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
@@ -37,7 +35,6 @@ import org.hibernate.annotations.TypeDefs;
  */
 @Entity
 @Table(name = "message_notification_subscription", schema = "messaging")
-@TypeDefs( {@TypeDef( name= "IntegerArray", typeClass = IntegerArrayUserType.class)})
 public class MessageNotificationSubscription implements Serializable {
 
     @Id
@@ -48,11 +45,11 @@ public class MessageNotificationSubscription implements Serializable {
     @Column(name = "universal_message_format_id")
     private Integer universalMessageFormatId;
     
-    @Type(type = "IntegerArray")
+    @Type(IntegerArrayUserType.class)
     @Column(name = "message_tag_ids")
     private Integer[] messageTagIds;
     
-    @Type(type = "IntegerArray")
+    @Type(IntegerArrayUserType.class)
     @Column(name = "crop_category_ids")
     private Integer[] cropCategoryIds;
 
diff --git a/src/main/java/no/nibio/vips/logic/messaging/ObservationNotificationSubscription.java b/src/main/java/no/nibio/vips/logic/messaging/ObservationNotificationSubscription.java
index 97d3d6e0b5ffc6443b6bde094172bf430c69cded..4bd02e336c86e29b099fe8bd25c807410098d8e2 100755
--- a/src/main/java/no/nibio/vips/logic/messaging/ObservationNotificationSubscription.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/ObservationNotificationSubscription.java
@@ -28,8 +28,6 @@ import javax.persistence.Id;
 import javax.persistence.Table;
 import no.nibio.vips.logic.util.IntegerArrayUserType;
 import org.hibernate.annotations.Type;
-import org.hibernate.annotations.TypeDef;
-import org.hibernate.annotations.TypeDefs;
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
@@ -37,7 +35,6 @@ import org.hibernate.annotations.TypeDefs;
  */
 @Entity
 @Table(name = "observation_notification_subscription", schema = "messaging")
-@TypeDefs( {@TypeDef( name= "IntegerArray", typeClass = IntegerArrayUserType.class)})
 public class ObservationNotificationSubscription implements Serializable {
 
     @Id
@@ -48,7 +45,7 @@ public class ObservationNotificationSubscription implements Serializable {
     @Column(name = "universal_message_format_id")
     private Integer universalMessageFormatId;
     
-    @Type(type = "IntegerArray")
+    @Type(IntegerArrayUserType.class)
     @Column(name = "crop_category_ids")
     private Integer[] cropCategoryIds;
 
diff --git a/src/main/java/no/nibio/vips/logic/messaging/UniversalMessage.java b/src/main/java/no/nibio/vips/logic/messaging/UniversalMessage.java
index c4c4725c95612442bb7feb4f4eed2ac2cfeebb37..60b9d803a36113668b7fbe640988b5aeccb4183b 100755
--- a/src/main/java/no/nibio/vips/logic/messaging/UniversalMessage.java
+++ b/src/main/java/no/nibio/vips/logic/messaging/UniversalMessage.java
@@ -49,8 +49,6 @@ import javax.xml.bind.annotation.XmlRootElement;
 import com.ibm.icu.util.ULocale;
 import no.nibio.vips.logic.util.StringJsonUserType;
 import org.hibernate.annotations.Type;
-import org.hibernate.annotations.TypeDef;
-import org.hibernate.annotations.TypeDefs;
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
@@ -59,7 +57,6 @@ import org.hibernate.annotations.TypeDefs;
 @Entity
 @Table(name = "universal_message", schema = "messaging")
 @XmlRootElement
-@TypeDefs( {@TypeDef( name= "StringJsonObject", typeClass = StringJsonUserType.class)})
 @NamedQueries({
     @NamedQuery(name = "UniversalMessage.findAll", query = "SELECT u FROM UniversalMessage u"),
     @NamedQuery(name = "UniversalMessage.findByUniversalMessageId", query = "SELECT u FROM UniversalMessage u WHERE u.universalMessageId = :universalMessageId"),
@@ -77,11 +74,11 @@ public class UniversalMessage implements Serializable {
     //@Column(name = "distribution_list", columnDefinition = "json")
     //@Convert(converter = PostgresJSONStringConverter.class)
     // Documentation on StackOverflow: http://stackoverflow.com/questions/15974474/mapping-postgresql-json-column-to-hibernate-value-type
-    @Type(type = "StringJsonObject")
+    @Type(StringJsonUserType.class)
     @Column(name = "distribution_list")
     private String distributionList;
     
-    @Type(type = "StringJsonObject")
+    @Type(StringJsonUserType.class)
     @Column(name = "message_local_versions")
     private String messageLocalVersions;
     
diff --git a/src/main/java/no/nibio/vips/logic/util/IntegerArrayUserType.java b/src/main/java/no/nibio/vips/logic/util/IntegerArrayUserType.java
index 876cb12003bdd0440c2fcaec1a49202f8346009b..f0db445e451099cb1522c6ddd3026f23a9798e7e 100755
--- a/src/main/java/no/nibio/vips/logic/util/IntegerArrayUserType.java
+++ b/src/main/java/no/nibio/vips/logic/util/IntegerArrayUserType.java
@@ -36,7 +36,7 @@ import org.hibernate.usertype.UserType;
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 
-public class IntegerArrayUserType implements UserType {
+public class IntegerArrayUserType implements UserType<Integer[]> {
 
     /**
      * Return the SQL type codes for the columns mapped by this type. The
@@ -46,10 +46,12 @@ public class IntegerArrayUserType implements UserType {
      * @see java.sql.Types
      */
     @Override
-    public int[] sqlTypes() {
-        return new int[] { Types.ARRAY };
+    public int getSqlType() {
+        return Types.ARRAY;
     }
 
+
+
     /**
      * The class returned by <tt>nullSafeGet()</tt>.
      *
@@ -69,7 +71,7 @@ public class IntegerArrayUserType implements UserType {
      * @return boolean
      */
     @Override
-    public boolean equals(Object x, Object y) throws HibernateException {
+    public boolean equals(Integer[] x, Integer[] y) throws HibernateException {
 
         if( x== null){
 
@@ -83,68 +85,14 @@ public class IntegerArrayUserType implements UserType {
      * Get a hashcode for the instance, consistent with persistence "equality"
      */
     @Override
-    public int hashCode(Object x) throws HibernateException {
+    public int hashCode(Integer[] x) throws HibernateException {
 
         return x.hashCode();
     }
 
-    /**
-     * Retrieve an instance of the mapped class from a JDBC resultset. Implementors
-     * should handle possibility of null values.
-     *
-     * @param rs      a JDBC result set
-     * @param names   the column names
-     * @param session
-     * @param owner   the containing entity  @return Object
-     * @throws org.hibernate.HibernateException
-     *
-     * @throws java.sql.SQLException
-     */
-    //@Override
-    public Object nullSafeGet(
-            ResultSet rs, 
-            String[] names, 
-            SessionImplementor session, 
-            Object owner) throws HibernateException, SQLException {
-       if (rs.wasNull()) {
-        return null;
-    }
 
-       try
-       {
-        Integer[] array = (Integer[]) rs.getArray(names[0]).getArray();
-        return array;
-       }
-       catch(NullPointerException ex)
-       {
-           return new Integer[0];
-       }
-    }
 
-    /**
-     * Write an instance of the mapped class to a prepared statement. Implementors
-     * should handle possibility of null values. A multi-column type should be written
-     * to parameters starting from <tt>index</tt>.
-     *
-     * @param st      a JDBC prepared statement
-     * @param value   the object to write
-     * @param index   statement parameter index
-     * @param session
-     * @throws org.hibernate.HibernateException
-     *
-     * @throws java.sql.SQLException
-     */
-    //@Override
-    public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException, SQLException {
-        if (value == null) {
-            st.setNull(index, Types.OTHER);
-            return;
-        }
 
-        Integer[] castObject = (Integer[]) value;
-        Array array = session.connection().createArrayOf("integer", castObject); // The postgres array data type
-        st.setArray(index, array);
-    }
 
     /**
      * Return a deep copy of the persistent state, stopping at entities and at
@@ -155,7 +103,7 @@ public class IntegerArrayUserType implements UserType {
      * @return Object a copy
      */
     @Override
-    public Object deepCopy(Object value) throws HibernateException {
+    public Integer[] deepCopy(Integer[] value) throws HibernateException {
 
         return value;
     }
@@ -182,7 +130,7 @@ public class IntegerArrayUserType implements UserType {
      *
      */
     @Override
-    public Serializable disassemble(Object value) throws HibernateException {
+    public Serializable disassemble(Integer[] value) throws HibernateException {
         return (Integer[])this.deepCopy( value);
     }
 
@@ -197,8 +145,8 @@ public class IntegerArrayUserType implements UserType {
      *
      */
     @Override
-    public Object assemble(Serializable cached, Object owner) throws HibernateException {
-        return this.deepCopy( cached);
+    public Integer[] assemble(Serializable cached, Object owner) throws HibernateException {
+        return this.deepCopy( (Integer[]) cached);
     }
 
     /**
@@ -213,7 +161,7 @@ public class IntegerArrayUserType implements UserType {
      * @return the value to be merged
      */
     @Override
-    public Object replace(Object original, Object target, Object owner) throws HibernateException {
+    public Integer[] replace(Integer[] original, Integer[] target, Object owner) throws HibernateException {
         return original;
     }
 
@@ -222,20 +170,20 @@ public class IntegerArrayUserType implements UserType {
      * should handle possibility of null values.
      *
      * @param rs      a JDBC result set
-     * @param strings   the column names
+     * @param position   position in row
      * @param ssci
      * @throws org.hibernate.HibernateException
      *
      * @throws java.sql.SQLException
      */
     @Override
-    public Object nullSafeGet(ResultSet rs, String[] strings, SharedSessionContractImplementor ssci, Object o) throws HibernateException, SQLException {
+    public Integer[] nullSafeGet(ResultSet rs, int position, SharedSessionContractImplementor ssci, Object o) throws HibernateException, SQLException {
         if (rs.wasNull()) {
             return null;
         }
         try
         {
-            Integer[] array = (Integer[]) rs.getArray(strings[0]).getArray();
+            Integer[] array = (Integer[]) rs.getArray(position).getArray();
             return array;
         }
         catch(NullPointerException ex)
@@ -258,14 +206,14 @@ public class IntegerArrayUserType implements UserType {
      * @throws java.sql.SQLException
      */
     @Override
-    public void nullSafeSet(PreparedStatement ps, Object o, int i, SharedSessionContractImplementor ssci) throws HibernateException, SQLException {
+    public void nullSafeSet(PreparedStatement ps, Integer[] o, int i, SharedSessionContractImplementor ssci) throws HibernateException, SQLException {
         if (o == null) {
             ps.setNull(i, Types.OTHER);
             return;
         }
 
         Integer[] castObject = (Integer[]) o;
-        Array array = ssci.connection().createArrayOf("integer", castObject); // The postgres array data type
+        Array array = ssci.getJdbcConnectionAccess().obtainConnection().createArrayOf("integer", castObject); // The postgres array data type
         ps.setArray(i, array);
     }
 
diff --git a/src/main/java/no/nibio/vips/logic/util/JsonPostgreSQLDialect.java b/src/main/java/no/nibio/vips/logic/util/JsonPostgreSQLDialect.java
deleted file mode 100755
index ec41d5de02b55b86c9b203fbf48c96c598c86b30..0000000000000000000000000000000000000000
--- a/src/main/java/no/nibio/vips/logic/util/JsonPostgreSQLDialect.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2015 NIBIO <http://www.nibio.no/>. 
- * 
- * This file is part of VIPSLogic.
- * VIPSLogic is free software: you can redistribute it and/or modify
- * it under the terms of the NIBIO Open Source License as published by 
- * NIBIO, either version 1 of the License, or (at your option) any
- * later version.
- * 
- * VIPSLogic is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * NIBIO Open Source License for more details.
- * 
- * You should have received a copy of the NIBIO Open Source License
- * along with VIPSLogic.  If not, see <http://www.nibio.no/licenses/>.
- * 
- */
-
-package no.nibio.vips.logic.util;
-
-import java.sql.Types;
-import org.hibernate.dialect.PostgreSQL9Dialect;
-
-/**
- * @copyright 2015 <a href="http://www.nibio.no/">NIBIO</a>
- * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
- */
-public class JsonPostgreSQLDialect extends PostgreSQL9Dialect{
-    public JsonPostgreSQLDialect() {
-
-        super();
-
-        this.registerColumnType(Types.JAVA_OBJECT, "json");
-    }
-}
diff --git a/src/main/java/no/nibio/vips/logic/util/StringJsonUserType.java b/src/main/java/no/nibio/vips/logic/util/StringJsonUserType.java
index 8dffa05bb6bcc34fa5552cabc7337636d2f94475..03d493062ca2f327f4f941571a84d01b20660a76 100755
--- a/src/main/java/no/nibio/vips/logic/util/StringJsonUserType.java
+++ b/src/main/java/no/nibio/vips/logic/util/StringJsonUserType.java
@@ -34,7 +34,7 @@ import org.hibernate.usertype.UserType;
  * @author Tor-Einar Skog <tor-einar.skog@nibio.no>
  */
 
-public class StringJsonUserType implements UserType {
+public class StringJsonUserType implements UserType<String> {
 
     /**
      * Return the SQL type codes for the columns mapped by this type. The
@@ -44,8 +44,8 @@ public class StringJsonUserType implements UserType {
      * @see java.sql.Types
      */
     @Override
-    public int[] sqlTypes() {
-        return new int[] { Types.JAVA_OBJECT};
+    public int getSqlType() {
+        return Types.JAVA_OBJECT;
     }
 
     /**
@@ -67,7 +67,7 @@ public class StringJsonUserType implements UserType {
      * @return boolean
      */
     @Override
-    public boolean equals(Object x, Object y) throws HibernateException {
+    public boolean equals(String x, String y) throws HibernateException {
 
         if( x== null){
 
@@ -81,7 +81,7 @@ public class StringJsonUserType implements UserType {
      * Get a hashcode for the instance, consistent with persistence "equality"
      */
     @Override
-    public int hashCode(Object x) throws HibernateException {
+    public int hashCode(String x) throws HibernateException {
 
         return x.hashCode();
     }
@@ -138,7 +138,7 @@ public class StringJsonUserType implements UserType {
      * @return Object a copy
      */
     @Override
-    public Object deepCopy(Object value) throws HibernateException {
+    public String deepCopy(String value) throws HibernateException {
 
         return value;
     }
@@ -165,7 +165,7 @@ public class StringJsonUserType implements UserType {
      *
      */
     @Override
-    public Serializable disassemble(Object value) throws HibernateException {
+    public Serializable disassemble(String value) throws HibernateException {
         return (String)this.deepCopy( value);
     }
 
@@ -180,8 +180,8 @@ public class StringJsonUserType implements UserType {
      *
      */
     @Override
-    public Object assemble(Serializable cached, Object owner) throws HibernateException {
-        return this.deepCopy( cached);
+    public String assemble(Serializable cached, Object owner) throws HibernateException {
+        return this.deepCopy( (String)cached);
     }
 
     /**
@@ -196,7 +196,7 @@ public class StringJsonUserType implements UserType {
      * @return the value to be merged
      */
     @Override
-    public Object replace(Object original, Object target, Object owner) throws HibernateException {
+    public String replace(String original, String target, Object owner) throws HibernateException {
         return original;
     }
 
@@ -206,18 +206,18 @@ public class StringJsonUserType implements UserType {
      * should handle possibility of null values.
      *
      * @param rs      a JDBC result set
-     * @param strings   the column names
+     * @param position   the column names
      * @param ssci
      * @throws org.hibernate.HibernateException
      *
      * @throws java.sql.SQLException
      */
     @Override
-    public Object nullSafeGet(ResultSet rs, String[] strings, SharedSessionContractImplementor ssci, Object o) throws HibernateException, SQLException {
-        if(rs.getString(strings[0]) == null){
+    public String nullSafeGet(ResultSet rs, int position, SharedSessionContractImplementor ssci, Object o) throws HibernateException, SQLException {
+        if(rs.getString(position) == null){
             return null;
         }
-        return rs.getString(strings[0]);
+        return rs.getString(position);
     }
 
     /**
@@ -234,7 +234,7 @@ public class StringJsonUserType implements UserType {
      * @throws java.sql.SQLException
      */
     @Override
-    public void nullSafeSet(PreparedStatement ps, Object o, int i, SharedSessionContractImplementor ssci) throws HibernateException, SQLException {
+    public void nullSafeSet(PreparedStatement ps, String o, int i, SharedSessionContractImplementor ssci) throws HibernateException, SQLException {
         if (o == null) {
             ps.setNull(i, Types.OTHER);
             return;
diff --git a/src/main/java/no/nibio/vips/observationdata/ObservationDataSchema.java b/src/main/java/no/nibio/vips/observationdata/ObservationDataSchema.java
index df6143ea59c734dd5413b6826581748735be444b..4c4a1edadd70fb45194db837bca793b722e1dab0 100755
--- a/src/main/java/no/nibio/vips/observationdata/ObservationDataSchema.java
+++ b/src/main/java/no/nibio/vips/observationdata/ObservationDataSchema.java
@@ -29,8 +29,6 @@ import javax.persistence.Table;
 import javax.xml.bind.annotation.XmlRootElement;
 import no.nibio.vips.logic.util.StringJsonUserType;
 import org.hibernate.annotations.Type;
-import org.hibernate.annotations.TypeDef;
-import org.hibernate.annotations.TypeDefs;
 
 /**
  * @copyright 2016 <a href="http://www.nibio.no/">NIBIO</a>
@@ -39,7 +37,6 @@ import org.hibernate.annotations.TypeDefs;
 @Entity
 @Table(name = "observation_data_schema")
 @XmlRootElement
-@TypeDefs( {@TypeDef( name= "StringJsonObject", typeClass = StringJsonUserType.class)})
 @NamedQueries({
     @NamedQuery(name = "ObservationDataSchema.findAll", query = "SELECT o FROM ObservationDataSchema o"),
     @NamedQuery(name = "ObservationDataSchema.findByPK", query = "SELECT o FROM ObservationDataSchema o WHERE o.observationDataSchemaPK.organizationId = :organizationId AND o.observationDataSchemaPK.organismId = :organismId"),
@@ -50,10 +47,10 @@ public class ObservationDataSchema implements Serializable {
     private static final long serialVersionUID = 1L;
     @EmbeddedId
     protected ObservationDataSchemaPK observationDataSchemaPK;
-    @Type(type = "StringJsonObject")
+    @Type(StringJsonUserType.class)
     @Column(name = "data_schema")
     private String dataSchema;
-    @Type(type = "StringJsonObject")
+    @Type(StringJsonUserType.class)
     @Column(name = "data_model")
     private String dataModel;