← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 14286: Use OptionSet instead of predefined value type in tracked entity attribute.

 

------------------------------------------------------------
revno: 14286
committer: Tran Chau <tran.hispvietnam@xxxxxxxxx>
branch nick: dhis2
timestamp: Wed 2014-03-19 13:44:30 +0700
message:
  Use OptionSet instead of predefined value type in tracked entity attribute.
removed:
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityAttributeOption.java
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityAttributeOptionStore.java
  dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/hibernate/HibernateTrackedEntityAttributeOptionStore.java
  dhis-2/dhis-services/dhis-service-tracker/src/main/resources/org/hisp/dhis/trackedentity/hibernate/TrackedEntityAttributeOption.hbm.xml
  dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/trackedentity/TrackedEntityAttributeOptionServiceTest.java
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/trackedentityattribute/RemoveAttributeOptionAction.java
added:
  resources/sql/create-optionset-from-tei-attribute-option.sql
modified:
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityAttribute.java
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityAttributeService.java
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentityattributevalue/TrackedEntityAttributeValue.java
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentityattributevalue/TrackedEntityAttributeValueService.java
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentityattributevalue/TrackedEntityAttributeValueStore.java
  dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/mobile/service/ActivityReportingServiceImpl.java
  dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/mobile/service/DefaultProgramService.java
  dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityAttributeService.java
  dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityFormService.java
  dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentityattributevalue/DefaultTrackedEntityAttributeValueService.java
  dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentityattributevalue/hibernate/HibernateTrackedEntityAttributeValueStore.java
  dhis-2/dhis-services/dhis-service-tracker/src/main/resources/META-INF/dhis/beans.xml
  dhis-2/dhis-services/dhis-service-tracker/src/main/resources/org/hisp/dhis/trackedentity/hibernate/TrackedEntityAttribute.hbm.xml
  dhis-2/dhis-services/dhis-service-tracker/src/main/resources/org/hisp/dhis/trackedentityattributevalue/hibernate/TrackedEntityAttributeValue.hbm.xml
  dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/trackedentityattributevalue/TrackedEntityAttributeValueServiceTest.java
  dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/trackedentityattributevalue/TrackedEntityAttributeValueStoreTest.java
  dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/deletion/DeletionHandler.java
  dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/DhisConvenienceTest.java
  dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/caseentry/ShowEventWithRegistrationFormAction.java
  dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/AddRepresentativeAction.java
  dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/AddTrackedEntityInstanceAction.java
  dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/GetAttributesByProgramAction.java
  dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/GetTrackedEntityInstanceAction.java
  dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/SaveAttributeAction.java
  dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/UpdateTrackedEntityInstanceAction.java
  dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/ValidateTrackedEntityInstanceAction.java
  dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/attributeFormDiv.vm
  dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/programEnrollmentForm.vm
  dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/trackedEntityInstanceForm.vm
  dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/beneficiaryenrollment/action/SaveMobileProgramEnrollmentAction.java
  dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/beneficiaryregistration/action/SaveBeneficiaryAction.java
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/trackedentityattribute/AddAttributeAction.java
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/trackedentityattribute/ShowAddAttributeFormAction.java
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/trackedentityattribute/ShowUpdateAttributeAction.java
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/trackedentityattribute/UpdateAttributeAction.java
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/resources/META-INF/dhis/beans.xml
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/resources/org/hisp/dhis/trackedentity/i18n_module.properties
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/resources/struts.xml
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/addAttributeForm.vm
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/addValidationCriteria.vm
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/addAttributeForm.js
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/attribute.js
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/updateAttributeForm.js
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/jsonParamsByProgram.vm
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/updateAttibuteForm.vm
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/updateValidationCriteria.vm


--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk

Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityAttribute.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityAttribute.java	2014-03-18 15:10:26 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityAttribute.java	2014-03-19 06:44:30 +0000
@@ -28,23 +28,23 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonView;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import java.util.Calendar;
+import java.util.Date;
+
 import org.hisp.dhis.common.BaseIdentifiableObject;
 import org.hisp.dhis.common.DxfNamespaces;
 import org.hisp.dhis.common.IdentifiableObject;
 import org.hisp.dhis.common.view.DetailedView;
+import org.hisp.dhis.common.view.ExportView;
 import org.hisp.dhis.common.view.WithoutOrganisationUnitsView;
+import org.hisp.dhis.option.OptionSet;
 import org.hisp.dhis.period.PeriodType;
 
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Set;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonView;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
 
 /**
  * @author Abyot Asalefew
@@ -59,16 +59,27 @@
     private static final long serialVersionUID = 3026922158464592390L;
 
     public static final String TYPE_DATE = "date";
+
     public static final String TYPE_STRING = "string";
+
     public static final String TYPE_INT = "number";
+
     public static final String VALUE_TYPE_LETTER = "letter";
+
     public static final String TYPE_BOOL = "bool";
+
     public static final String TYPE_TRUE_ONLY = "trueOnly";
+
     public static final String TYPE_COMBO = "combo";
+
     public static final String TYPE_PHONE_NUMBER = "phoneNumber";
+
     public static final String TYPE_TRACKER_ASSOCIATE = "trackerAssociate";
+
     public static final String TYPE_USERS = "users";
+
     public static final String TYPE_AGE = "age";
+
     public static final String VALUE_TYPE_LOCAL_ID = "localId";
 
     private String description;
@@ -83,7 +94,7 @@
 
     private TrackedEntityAttributeGroup attributeGroup;
 
-    private Set<TrackedEntityAttributeOption> attributeOptions = new HashSet<TrackedEntityAttributeOption>();
+    private OptionSet optionSet;
 
     private String expression;
 
@@ -143,30 +154,6 @@
     // Getters and setters
     // -------------------------------------------------------------------------
 
-    @JsonProperty( "trackedEntityAttributeOptions" )
-    @JsonView( { DetailedView.class } )
-    @JacksonXmlElementWrapper( localName = "trackedEntityAttributeOptions", namespace = DxfNamespaces.DXF_2_0 )
-    @JacksonXmlProperty( localName = "trackedEntityAttributeOption", namespace = DxfNamespaces.DXF_2_0 )
-    public Set<TrackedEntityAttributeOption> getAttributeOptions()
-    {
-        return attributeOptions == null ? new HashSet<TrackedEntityAttributeOption>() : attributeOptions;
-    }
-
-    public void setAttributeOptions( Set<TrackedEntityAttributeOption> attributeOptions )
-    {
-        this.attributeOptions = attributeOptions;
-    }
-
-    public void addAttributeOptions( TrackedEntityAttributeOption option )
-    {
-        if ( attributeOptions == null )
-        {
-            attributeOptions = new HashSet<TrackedEntityAttributeOption>();
-        }
-
-        attributeOptions.add( option );
-    }
-
     @JsonProperty
     @JsonView( { DetailedView.class } )
     @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 )
@@ -361,6 +348,19 @@
         this.periodType = periodType;
     }
 
+    @JsonProperty
+    @JsonView( { DetailedView.class, ExportView.class } )
+    @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 )
+    public OptionSet getOptionSet()
+    {
+        return optionSet;
+    }
+
+    public void setOptionSet( OptionSet optionSet )
+    {
+        this.optionSet = optionSet;
+    }
+
     // -------------------------------------------------------------------------
     // Static methods
     // -------------------------------------------------------------------------
@@ -421,9 +421,6 @@
             groupBy = trackedEntityAttribute.getGroupBy();
             attributeGroup = trackedEntityAttribute.getAttributeGroup();
 
-            attributeOptions.clear();
-            attributeOptions.addAll( trackedEntityAttribute.getAttributeOptions() );
-
             expression = trackedEntityAttribute.getExpression();
             displayOnVisitSchedule = trackedEntityAttribute.getDisplayOnVisitSchedule();
             sortOrderInVisitSchedule = trackedEntityAttribute.getSortOrderInVisitSchedule();

=== removed file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityAttributeOption.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityAttributeOption.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityAttributeOption.java	1970-01-01 00:00:00 +0000
@@ -1,77 +0,0 @@
-package org.hisp.dhis.trackedentity;
-
-/*
- * Copyright (c) 2004-2014, University of Oslo
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * Neither the name of the HISP project nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-import org.hisp.dhis.common.BaseIdentifiableObject;
-import org.hisp.dhis.common.DxfNamespaces;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
-
-/**
- * @author Viet
- */
-@JacksonXmlRootElement( localName = "trackedEntityAttributeOption", namespace = DxfNamespaces.DXF_2_0 )
-public class TrackedEntityAttributeOption
-    extends BaseIdentifiableObject
-{
-    /**
-     * Determines if a de-serialized file is compatible with this class.
-     */
-    private static final long serialVersionUID = 9052641474847384010L;
-
-    private TrackedEntityAttribute attribute;
-
-    // -------------------------------------------------------------------------
-    // Constructors
-    // -------------------------------------------------------------------------
-
-    public TrackedEntityAttributeOption()
-    {
-    }
-
-    // -------------------------------------------------------------------------
-    // Getters and setters
-    // -------------------------------------------------------------------------
-
-    @JsonProperty
-    @JsonSerialize( as = BaseIdentifiableObject.class )
-    @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 )
-    public TrackedEntityAttribute getAttribute()
-    {
-        return attribute;
-    }
-
-    public void setAttribute( TrackedEntityAttribute attribute )
-    {
-        this.attribute = attribute;
-    }
-}
\ No newline at end of file

=== removed file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityAttributeOptionStore.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityAttributeOptionStore.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityAttributeOptionStore.java	1970-01-01 00:00:00 +0000
@@ -1,60 +0,0 @@
-package org.hisp.dhis.trackedentity;
-
-/*
- * Copyright (c) 2004-2014, University of Oslo
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * Neither the name of the HISP project nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-import java.util.Collection;
-
-import org.hisp.dhis.common.GenericIdentifiableObjectStore;
-
-public interface TrackedEntityAttributeOptionStore
-    extends GenericIdentifiableObjectStore<TrackedEntityAttributeOption>
-{
-    /**
-     * Returns a {@link TrackedEntityAttributeOption} with a given name.
-     * 
-     * @param attribute {@link TrackedEntityAttribute}
-     * 
-     * @param name the name of the TrackedEntityAttributeOption to return.
-     * 
-     * @return the TrackedEntityAttributeOption with the given name, or null if
-     * no match.
-     */
-    TrackedEntityAttributeOption get( TrackedEntityAttribute attribute, String name );
-
-    /**
-     * Get all {@link TrackedEntityAttributeOption} of a
-     * {@link TrackedEntityAttribute}
-     * 
-     * @param attribute {@link TrackedEntityAttribute}
-     * 
-     * @return {@link TrackedEntityAttributeOption}
-     */
-    Collection<TrackedEntityAttributeOption> get( TrackedEntityAttribute attribute );
-
-}

=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityAttributeService.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityAttributeService.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentity/TrackedEntityAttributeService.java	2014-03-19 06:44:30 +0000
@@ -200,60 +200,4 @@
      */
     int getTrackedEntityAttributeCountByName( String name );
     
-    // -------------------------------------------------------------------------
-    // TrackedEntityAttributeOption
-    // -------------------------------------------------------------------------
-    
-    /**
-     * Adds an {@link TrackedEntityAttributeOption}
-     * 
-     * @param option The to TrackedEntityAttributeOption add.
-     * 
-     * @return A generated unique id of the added {@link TrackedEntityAttributeOption}.
-     */
-    int addTrackedEntityAttributeOption( TrackedEntityAttributeOption option );
-
-    /**
-     * Updates a {@link TrackedEntityAttributeOption}.
-     * 
-     * @param option the TrackedEntityAttributeOption to update.
-     */
-    void updateTrackedEntityAttributeOption( TrackedEntityAttributeOption option );
-
-    /**
-     * Deletes a {@link TrackedEntityAttributeOption}.
-     * 
-     * @param option the TrackedEntityAttributeOption to delete.
-     */
-    void deleteTrackedEntityAttributeOption( TrackedEntityAttributeOption option );
-
-    /**
-     * Returns a {@link TrackedEntityAttributeOption} with a given name.
-     * 
-     * @param attribute {@link TrackedEntityAttribute}
-     * @param name the name of the TrackedEntityAttributeOption to return.
-     * 
-     * @return the TrackedEntityAttributeOption with the given name, or null if no
-     *         match.
-     */
-    TrackedEntityAttributeOption getTrackedEntityAttributeOption( TrackedEntityAttribute attribute, String name );
-
-    /**
-     * Returns a {@link TrackedEntityAttributeOption}.
-     * 
-     * @param id the id of the TrackedEntityAttributeOption to return.
-     * 
-     * @return the TrackedEntityAttributeOption with the given id
-     */
-    TrackedEntityAttributeOption getTrackedEntityAttributeOption( int id );
-
-    /**
-     * Get all {@link TrackedEntityAttributeOption} of a {@link TrackedEntityAttribute}
-     * 
-     * @param attribute {@link TrackedEntityAttribute}
-     * 
-     * @return {@link TrackedEntityAttributeOption}
-     */
-    Collection<TrackedEntityAttributeOption> getTrackedEntityAttributeOption( TrackedEntityAttribute attribute );
-
 }

=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentityattributevalue/TrackedEntityAttributeValue.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentityattributevalue/TrackedEntityAttributeValue.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentityattributevalue/TrackedEntityAttributeValue.java	2014-03-19 06:44:30 +0000
@@ -31,7 +31,6 @@
 import java.io.Serializable;
 
 import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeOption;
 import org.hisp.dhis.trackedentity.TrackedEntityInstance;
 
 /**
@@ -55,8 +54,6 @@
 
     private String value;
 
-    private TrackedEntityAttributeOption attributeOption;
-
     // -------------------------------------------------------------------------
     // Constructors
     // -------------------------------------------------------------------------
@@ -90,7 +87,6 @@
         int result = 1;
         result = prime * result + ((entityInstance == null) ? 0 : entityInstance.hashCode());
         result = prime * result + ((attribute == null) ? 0 : attribute.hashCode());
-        result = prime * result + ((attributeOption == null) ? 0 : attributeOption.hashCode());
         result = prime * result + ((value == null) ? 0 : value.hashCode());
         return result;
     }
@@ -139,18 +135,6 @@
             return false;
         }
 
-        if ( attributeOption == null )
-        {
-            if ( other.attributeOption != null )
-            {
-                return false;
-            }
-        }
-        else if ( !attributeOption.equals( other.attributeOption ) )
-        {
-            return false;
-        }
-
         if ( value == null )
         {
             if ( other.value != null )
@@ -170,7 +154,7 @@
     public String toString()
     {
         return "[Tracked attribute=" + attribute + ", entityInstance=" + entityInstance + ", value='" + value + "'"
-            + ", attribute option=" + attributeOption + "]";
+            + "]";
     }
 
     // -------------------------------------------------------------------------
@@ -202,16 +186,6 @@
         this.entityInstance = entityInstance;
     }
 
-    public TrackedEntityAttributeOption getAttributeOption()
-    {
-        return attributeOption;
-    }
-
-    public void setAttributeOption( TrackedEntityAttributeOption attributeOption )
-    {
-        this.attributeOption = attributeOption;
-    }
-
     public void setValue( String value )
     {
         this.value = value;

=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentityattributevalue/TrackedEntityAttributeValueService.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentityattributevalue/TrackedEntityAttributeValueService.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentityattributevalue/TrackedEntityAttributeValueService.java	2014-03-19 06:44:30 +0000
@@ -32,7 +32,6 @@
 import java.util.Map;
 
 import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeOption;
 import org.hisp.dhis.trackedentity.TrackedEntityInstance;
 
 /**
@@ -182,21 +181,4 @@
      */
     Collection<TrackedEntityInstance> getTrackedEntityInstance( TrackedEntityAttribute attribute, String value );
 
-    /**
-     * Update attribute values which belong to the pre-defined attribute
-     * when a value pre-defined of this attribute is modified
-     * 
-     * @param attributeOption TrackedEntityAttributeOption
-     */
-    void updateTrackedEntityAttributeValues( TrackedEntityAttributeOption attributeOption );
-
-    /**
-     * Get the number of {@link TrackedEntityAttributeOption} in all
-     * {@link TrackedEntityAttribute}
-     * 
-     * @param attributeOption TrackedEntityAttributeOption
-     * 
-     * @return The number of TrackedEntityAttributeOptions
-     */
-    int countByAttributeOption( TrackedEntityAttributeOption attributeOption );
 }

=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentityattributevalue/TrackedEntityAttributeValueStore.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentityattributevalue/TrackedEntityAttributeValueStore.java	2014-03-18 15:10:26 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/trackedentityattributevalue/TrackedEntityAttributeValueStore.java	2014-03-19 06:44:30 +0000
@@ -33,7 +33,6 @@
 import org.hisp.dhis.common.GenericStore;
 import org.hisp.dhis.program.Program;
 import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeOption;
 import org.hisp.dhis.trackedentity.TrackedEntityInstance;
 
 /**
@@ -70,8 +69,8 @@
     int deleteByAttribute( TrackedEntityAttribute attribute );
 
     /**
-     * Retrieve a {@link TrackedEntityAttributeValue} on a {@link TrackedEntityInstance} and
-     * {@link TrackedEntityAttribute}
+     * Retrieve a {@link TrackedEntityAttributeValue} on a
+     * {@link TrackedEntityInstance} and {@link TrackedEntityAttribute}
      * 
      * @param attribute {@link TrackedEntityAttribute}
      * 
@@ -80,7 +79,8 @@
     TrackedEntityAttributeValue get( TrackedEntityInstance instance, TrackedEntityAttribute attribute );
 
     /**
-     * Retrieve {@link TrackedEntityAttributeValue} of a {@link TrackedEntityInstance}
+     * Retrieve {@link TrackedEntityAttributeValue} of a
+     * {@link TrackedEntityInstance}
      * 
      * @param instance TrackedEntityInstance
      * 
@@ -89,7 +89,8 @@
     Collection<TrackedEntityAttributeValue> get( TrackedEntityInstance instance );
 
     /**
-     * Retrieve {@link TrackedEntityAttributeValue} of a {@link TrackedEntityInstance}
+     * Retrieve {@link TrackedEntityAttributeValue} of a
+     * {@link TrackedEntityInstance}
      * 
      * @param instance TrackedEntityInstance
      * 
@@ -107,8 +108,8 @@
     Collection<TrackedEntityAttributeValue> get( Collection<TrackedEntityInstance> instances );
 
     /**
-     * Search TrackedEntityAttributeValue objects by a TrackedEntityAttribute and a attribute
-     * value (performs partial search )
+     * Search TrackedEntityAttributeValue objects by a TrackedEntityAttribute
+     * and a attribute value (performs partial search )
      * 
      * @param attribute TrackedEntityAttribute
      * @param searchText A string for searching by attribute values
@@ -118,16 +119,6 @@
     Collection<TrackedEntityAttributeValue> searchByValue( TrackedEntityAttribute attribute, String searchText );
 
     /**
-     * Get the number of {@link TrackedEntityAttributeOption} in all
-     * {@link TrackedEntityAttribute}
-     * 
-     * @param attributeOption TrackedEntityAttributeOption
-     * 
-     * @return The number of TrackedEntityAttributeOptions
-     */
-    int countByAttributeOption( TrackedEntityAttributeOption attributeOption );
-
-    /**
      * Retrieve instances who have the same value on an attribute
      * 
      * @param attribute TrackedEntityAttribute
@@ -138,14 +129,6 @@
     Collection<TrackedEntityInstance> getTrackedEntityInstances( TrackedEntityAttribute attribute, String value );
 
     /**
-     * Update attribute values which belong to the pre-defined attribute
-     * when a value pre-defined of this attribute is modified
-     * 
-     * @param attributeOption TrackedEntityAttributeOption
-     */
-    void updateTrackedEntityAttributeValues( TrackedEntityAttributeOption attributeOption );
-    
-    /**
      * Retrieve attribute values of an instance by a program
      * 
      * @param instance TrackedEntityInstance

=== modified file 'dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/mobile/service/ActivityReportingServiceImpl.java'
--- dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/mobile/service/ActivityReportingServiceImpl.java	2014-03-18 14:54:13 +0000
+++ dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/mobile/service/ActivityReportingServiceImpl.java	2014-03-19 06:44:30 +0000
@@ -84,7 +84,6 @@
 import org.hisp.dhis.sms.SmsSender;
 import org.hisp.dhis.system.util.DateUtils;
 import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeOption;
 import org.hisp.dhis.trackedentity.TrackedEntityAttributeService;
 import org.hisp.dhis.trackedentity.TrackedEntityInstance;
 import org.hisp.dhis.trackedentity.TrackedEntityInstanceService;
@@ -1420,16 +1419,7 @@
             patientAttribute.setName( name );
             patientAttribute.setType( pa.getValueType() );
             patientAttribute.setValue( "" );
-            List<String> optionList = new ArrayList<String>();
-            if ( pa.getAttributeOptions() != null )
-            {
-                for ( TrackedEntityAttributeOption option : pa.getAttributeOptions() )
-                {
-                    optionList.add( option.getName() );
-                }
-            }
-
-            patientAttribute.setPredefinedValues( optionList );
+           
             list.add( patientAttribute );
         }
         return list;

=== modified file 'dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/mobile/service/DefaultProgramService.java'
--- dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/mobile/service/DefaultProgramService.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-services/dhis-service-mobile/src/main/java/org/hisp/dhis/mobile/service/DefaultProgramService.java	2014-03-19 06:44:30 +0000
@@ -45,7 +45,6 @@
 import org.hisp.dhis.program.ProgramStageSection;
 import org.hisp.dhis.program.ProgramTrackedEntityAttribute;
 import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeOption;
 import org.springframework.beans.factory.annotation.Required;
 
 public class DefaultProgramService
@@ -88,9 +87,9 @@
         {
             programs.add( getProgramLWUIT( program.getId() ) );
         }
-        
-        System.out.println("Program by unit size: " + programByUnit.size());
-        System.out.println("Program size: " + programs.size());
+
+        System.out.println( "Program by unit size: " + programByUnit.size() );
+        System.out.println( "Program size: " + programs.size() );
 
         return programs;
     }
@@ -288,23 +287,16 @@
         return pr;
     }
 
-    private org.hisp.dhis.api.mobile.model.PatientAttribute getPatientAttributeForMobile( ProgramTrackedEntityAttribute ppa )
+    private org.hisp.dhis.api.mobile.model.PatientAttribute getPatientAttributeForMobile(
+        ProgramTrackedEntityAttribute ppa )
     {
         TrackedEntityAttribute pa = ppa.getAttribute();
-        List<String> optionList = new ArrayList<String>();
-        if ( pa.getAttributeOptions() != null )
-        {
-            for ( TrackedEntityAttributeOption pao : pa.getAttributeOptions() )
-            {
-                optionList.add( pao.getName() );
-            }
-        }
+
         org.hisp.dhis.api.mobile.model.PatientAttribute mobileAttribute = new org.hisp.dhis.api.mobile.model.PatientAttribute();
         mobileAttribute.setName( pa.getName() );
         mobileAttribute.setMandatory( pa.isMandatory() );
         mobileAttribute.setType( pa.getValueType() );
         mobileAttribute.setValue( "" );
-        mobileAttribute.setPredefinedValues( optionList );
         if ( ppa.getDisplayedInList() )
         {
             mobileAttribute.setDisplayedInList( true );

=== modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityAttributeService.java'
--- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityAttributeService.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityAttributeService.java	2014-03-19 06:44:30 +0000
@@ -53,13 +53,6 @@
         this.attributeStore = attributeStore;
     }
 
-    private TrackedEntityAttributeOptionStore attributeOptionStore;
-
-    public void setAttributeOptionStore( TrackedEntityAttributeOptionStore attributeOptionStore )
-    {
-        this.attributeOptionStore = attributeOptionStore;
-    }
-
     private ProgramService programService;
 
     public void setProgramService( ProgramService programService )
@@ -142,7 +135,7 @@
         Collection<TrackedEntityAttribute> result = attributeStore.getAll();
 
         Collection<Program> programs = programService.getAllPrograms();
-        
+
         if ( result != null )
         {
             for ( Program program : programs )
@@ -181,37 +174,5 @@
         return attributeStore.getCountLikeName( name );
     }
 
-    // -------------------------------------------------------------------------
-    // TrackedEntityAttributeOption
-    // -------------------------------------------------------------------------
-
-    public int addTrackedEntityAttributeOption( TrackedEntityAttributeOption option )
-    {
-        return attributeOptionStore.save( option );
-    }
-
-    public void deleteTrackedEntityAttributeOption( TrackedEntityAttributeOption option )
-    {
-        attributeOptionStore.delete( option );
-    }
-
-    public void updateTrackedEntityAttributeOption( TrackedEntityAttributeOption option )
-    {
-        attributeOptionStore.update( option );
-    }
-
-    public TrackedEntityAttributeOption getTrackedEntityAttributeOption( TrackedEntityAttribute attribute, String name )
-    {
-        return attributeOptionStore.get( attribute, name );
-    }
-
-    public TrackedEntityAttributeOption getTrackedEntityAttributeOption( int id )
-    {
-        return attributeOptionStore.get( id );
-    }
-
-    public Collection<TrackedEntityAttributeOption> getTrackedEntityAttributeOption( TrackedEntityAttribute attribute )
-    {
-        return attributeOptionStore.get( attribute );
-    }
+  
 }

=== modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityFormService.java'
--- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityFormService.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/DefaultTrackedEntityFormService.java	2014-03-19 06:44:30 +0000
@@ -322,14 +322,14 @@
         {
             inputHtml = inputHtml.replaceFirst( "input", "select" ) + ">";
             inputHtml += "<option value=\"\" selected>" + i18n.getString( "no_value" ) + "</option>";
-            for ( TrackedEntityAttributeOption option : attribute.getAttributeOptions() )
+            for ( String option : attribute.getOptionSet().getOptions() )
             {
-                inputHtml += "<option value=\"" + option.getId() + "\" ";
-                if ( option.getName().equals( value ) )
+                inputHtml += "<option value=\"" + option + "\" ";
+                if ( option.equals( value ) )
                 {
                     inputHtml += " selected ";
                 }
-                inputHtml += ">" + option.getName() + "</option>";
+                inputHtml += ">" + option + "</option>";
             }
             inputHtml += "</select>";
         }

=== removed file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/hibernate/HibernateTrackedEntityAttributeOptionStore.java'
--- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/hibernate/HibernateTrackedEntityAttributeOptionStore.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentity/hibernate/HibernateTrackedEntityAttributeOptionStore.java	1970-01-01 00:00:00 +0000
@@ -1,54 +0,0 @@
-package org.hisp.dhis.trackedentity.hibernate;
-
-/*
- * Copyright (c) 2004-2014, University of Oslo
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * Neither the name of the HISP project nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-import java.util.Collection;
-
-import org.hibernate.criterion.Restrictions;
-import org.hisp.dhis.common.hibernate.HibernateIdentifiableObjectStore;
-import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeOption;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeOptionStore;
-
-public class HibernateTrackedEntityAttributeOptionStore
-    extends HibernateIdentifiableObjectStore<TrackedEntityAttributeOption>
-    implements TrackedEntityAttributeOptionStore
-{
-    public TrackedEntityAttributeOption get( TrackedEntityAttribute attribute, String name )
-    {
-        return (TrackedEntityAttributeOption) getCriteria( Restrictions.eq( "name", name ),
-            Restrictions.eq( "attribute", attribute ) ).uniqueResult();
-    }
-
-    @SuppressWarnings( "unchecked" )
-    public Collection<TrackedEntityAttributeOption> get( TrackedEntityAttribute attribute )
-    {
-        return getCriteria( Restrictions.eq( "attribute", attribute ) ).list();
-    }
-}

=== modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentityattributevalue/DefaultTrackedEntityAttributeValueService.java'
--- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentityattributevalue/DefaultTrackedEntityAttributeValueService.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentityattributevalue/DefaultTrackedEntityAttributeValueService.java	2014-03-19 06:44:30 +0000
@@ -35,7 +35,6 @@
 import java.util.Set;
 
 import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeOption;
 import org.hisp.dhis.trackedentity.TrackedEntityInstance;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -150,8 +149,8 @@
             {
                 if ( attributeValueMap.containsKey( attributeValue.getEntityInstance().getId() ) )
                 {
-                    Collection<TrackedEntityAttributeValue> values = attributeValueMap.get( attributeValue.getEntityInstance()
-                        .getId() );
+                    Collection<TrackedEntityAttributeValue> values = attributeValueMap.get( attributeValue
+                        .getEntityInstance().getId() );
                     values.add( attributeValue );
                 }
                 else
@@ -211,21 +210,9 @@
     }
 
     @Override
-    public int countByAttributeOption( TrackedEntityAttributeOption attributeOption )
-    {
-        return attributeValueStore.countByAttributeOption( attributeOption );
-    }
-
-    @Override
     public Collection<TrackedEntityInstance> getTrackedEntityInstance( TrackedEntityAttribute attribute, String value )
     {
         return attributeValueStore.getTrackedEntityInstances( attribute, value );
     }
 
-    @Override
-    public void updateTrackedEntityAttributeValues( TrackedEntityAttributeOption attributeOption )
-    {
-        attributeValueStore.updateTrackedEntityAttributeValues( attributeOption );
-    }
-
 }

=== modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentityattributevalue/hibernate/HibernateTrackedEntityAttributeValueStore.java'
--- dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentityattributevalue/hibernate/HibernateTrackedEntityAttributeValueStore.java	2014-03-18 15:10:26 +0000
+++ dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/trackedentityattributevalue/hibernate/HibernateTrackedEntityAttributeValueStore.java	2014-03-19 06:44:30 +0000
@@ -35,9 +35,8 @@
 import org.hibernate.criterion.Restrictions;
 import org.hisp.dhis.hibernate.HibernateGenericStore;
 import org.hisp.dhis.program.Program;
+import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
 import org.hisp.dhis.trackedentity.TrackedEntityInstance;
-import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeOption;
 import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue;
 import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueStore;
 
@@ -112,14 +111,6 @@
     }
 
     @Override
-    public int countByAttributeOption( TrackedEntityAttributeOption attributeOption )
-    {
-        Number rs = (Number) getCriteria( Restrictions.eq( "attributeOption", attributeOption ) ).setProjection(
-            Projections.rowCount() ).uniqueResult();
-        return rs != null ? rs.intValue() : 0;
-    }
-
-    @Override
     @SuppressWarnings( "unchecked" )
     public Collection<TrackedEntityInstance> getTrackedEntityInstances( TrackedEntityAttribute attribute, String value )
     {
@@ -129,16 +120,6 @@
     }
 
     @Override
-    public void updateTrackedEntityAttributeValues( TrackedEntityAttributeOption attributeOption )
-    {
-        String hql = "UPDATE TrackedEntityAttributeValue SET value=:value where attributeOption=:attributeOption";
-        Query query = getQuery( hql );
-        query.setString( "value", attributeOption.getName() );
-        query.setEntity( "attributeOption", attributeOption );
-        query.executeUpdate();
-    }
-
-    @Override
     @SuppressWarnings( "unchecked" )
     public Collection<TrackedEntityAttributeValue> get( TrackedEntityInstance entityInstance, Program program )
     {

=== modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/resources/META-INF/dhis/beans.xml'
--- dhis-2/dhis-services/dhis-service-tracker/src/main/resources/META-INF/dhis/beans.xml	2014-03-17 11:30:30 +0000
+++ dhis-2/dhis-services/dhis-service-tracker/src/main/resources/META-INF/dhis/beans.xml	2014-03-19 06:44:30 +0000
@@ -74,9 +74,11 @@
 
 	<bean id="org.hisp.dhis.trackedentity.TrackedEntityInstanceStore"
 		class="org.hisp.dhis.trackedentity.hibernate.HibernateTrackedEntityInstanceStore">
-		<property name="clazz" value="org.hisp.dhis.trackedentity.TrackedEntityInstance" />
+		<property name="clazz"
+			value="org.hisp.dhis.trackedentity.TrackedEntityInstance" />
 		<property name="sessionFactory" ref="sessionFactory" />
-		<property name="organisationUnitService" ref="org.hisp.dhis.organisationunit.OrganisationUnitService" />
+		<property name="organisationUnitService"
+			ref="org.hisp.dhis.organisationunit.OrganisationUnitService" />
 		<property name="jdbcTemplate" ref="jdbcTemplate" />
 		<property name="statementBuilder" ref="statementBuilder" />
 	</bean>
@@ -97,13 +99,6 @@
 		<property name="jdbcTemplate" ref="jdbcTemplate" />
 	</bean>
 
-	<bean id="org.hisp.dhis.trackedentity.TrackedEntityAttributeOptionStore"
-		class="org.hisp.dhis.trackedentity.hibernate.HibernateTrackedEntityAttributeOptionStore">
-		<property name="clazz"
-			value="org.hisp.dhis.trackedentity.TrackedEntityAttributeOption" />
-		<property name="sessionFactory" ref="sessionFactory" />
-	</bean>
-
 	<bean
 		id="org.hisp.dhis.trackedentitydatavalue.TrackedEntityDataValueStore"
 		class="org.hisp.dhis.trackedentitydatavalue.hibernate.HibernateTrackedEntityDataValueStore">
@@ -130,13 +125,13 @@
 			value="org.hisp.dhis.trackedentity.TrackedEntityAudit" />
 		<property name="sessionFactory" ref="sessionFactory" />
 	</bean>
-	
-	<bean id="org.hisp.dhis.trackedentity.TrackedEntityStore" 
+
+	<bean id="org.hisp.dhis.trackedentity.TrackedEntityStore"
 		class="org.hisp.dhis.common.hibernate.HibernateIdentifiableObjectStore">
 		<property name="clazz" value="org.hisp.dhis.trackedentity.TrackedEntity" />
 		<property name="sessionFactory" ref="sessionFactory" />
 	</bean>
-	
+
 	<!-- Service definitions -->
 
 	<bean id="org.hisp.dhis.program.ProgramDataEntryService" class="org.hisp.dhis.program.DefaultProgramDataEntryService">
@@ -243,23 +238,20 @@
 		<property name="attributeService"
 			ref="org.hisp.dhis.trackedentity.TrackedEntityAttributeService" />
 		<property name="trackedEntityService"
-		    ref="org.hisp.dhis.trackedentity.TrackedEntityService" />
+			ref="org.hisp.dhis.trackedentity.TrackedEntityService" />
 		<property name="relationshipTypeService"
 			ref="org.hisp.dhis.relationship.RelationshipTypeService" />
 		<property name="relationshipService"
 			ref="org.hisp.dhis.relationship.RelationshipService" />
-	    <property name="programService"
-	        ref="org.hisp.dhis.program.ProgramService" />
-	    <property name="organisationUnitService"
-	        ref="org.hisp.dhis.organisationunit.OrganisationUnitService" />
+		<property name="programService" ref="org.hisp.dhis.program.ProgramService" />
+		<property name="organisationUnitService"
+			ref="org.hisp.dhis.organisationunit.OrganisationUnitService" />
 	</bean>
 
 	<bean id="org.hisp.dhis.trackedentity.TrackedEntityAttributeService"
 		class="org.hisp.dhis.trackedentity.DefaultTrackedEntityAttributeService">
 		<property name="attributeStore"
 			ref="org.hisp.dhis.trackedentity.TrackedEntityAttributeStore" />
-		<property name="attributeOptionStore"
-			ref="org.hisp.dhis.trackedentity.TrackedEntityAttributeOptionStore" />
 		<property name="programService" ref="org.hisp.dhis.program.ProgramService" />
 	</bean>
 
@@ -295,9 +287,8 @@
 		<property name="auditStore"
 			ref="org.hisp.dhis.trackedentity.TrackedEntityAuditStore" />
 	</bean>
-	
-	<bean id="org.hisp.dhis.trackedentity.TrackedEntityService"
-		class="org.hisp.dhis.trackedentity.DefaultTrackedEntityService">
+
+	<bean id="org.hisp.dhis.trackedentity.TrackedEntityService" class="org.hisp.dhis.trackedentity.DefaultTrackedEntityService">
 		<property name="trackedEntityStore"
 			ref="org.hisp.dhis.trackedentity.TrackedEntityStore" />
 	</bean>
@@ -412,7 +403,6 @@
 			<list>
 				<value>trackedentityattribute</value>
 				<value>trackedentityattributegroup</value>
-                <value>trackedentityattributeoption</value>
 				<value>program</value>
 				<value>programstage</value>
 				<value>programinstance</value>
@@ -530,11 +520,15 @@
 		<property name="arguments">
 			<list>
 				<list>
-					<ref local="org.hisp.dhis.trackedentity.TrackedEntityInstanceDeletionHandler" />
-					<ref local="org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueDeletionHandler" />
+					<ref
+						local="org.hisp.dhis.trackedentity.TrackedEntityInstanceDeletionHandler" />
+					<ref
+						local="org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueDeletionHandler" />
 					<ref local="org.hisp.dhis.relationship.RelationshipDeletionHandler" />
-					<ref local="org.hisp.dhis.trackedentity.TrackedEntityAuditDeletionHandler" />
-					<ref local="org.hisp.dhis.trackedentitydatavalue.TrackedEntityDataValueDeletionHandler" />
+					<ref
+						local="org.hisp.dhis.trackedentity.TrackedEntityAuditDeletionHandler" />
+					<ref
+						local="org.hisp.dhis.trackedentitydatavalue.TrackedEntityDataValueDeletionHandler" />
 					<ref local="org.hisp.dhis.program.ProgramDeletionHandler" />
 					<ref local="org.hisp.dhis.program.ProgramStageDeletionHandler" />
 					<ref local="org.hisp.dhis.program.ProgramStageSectionDeletionHandler" />

=== modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/resources/org/hisp/dhis/trackedentity/hibernate/TrackedEntityAttribute.hbm.xml'
--- dhis-2/dhis-services/dhis-service-tracker/src/main/resources/org/hisp/dhis/trackedentity/hibernate/TrackedEntityAttribute.hbm.xml	2014-02-07 20:25:49 +0000
+++ dhis-2/dhis-services/dhis-service-tracker/src/main/resources/org/hisp/dhis/trackedentity/hibernate/TrackedEntityAttribute.hbm.xml	2014-03-19 06:44:30 +0000
@@ -26,10 +26,8 @@
     <many-to-one name="attributeGroup" column="trackedentityattributegroupid" class="org.hisp.dhis.trackedentity.TrackedEntityAttributeGroup"
       foreign-key="fk_attribute_group" />
 
-    <set name="attributeOptions">
-      <key column="trackedentityattributeid" />
-      <one-to-many class="org.hisp.dhis.trackedentity.TrackedEntityAttributeOption" />
-    </set>
+   <many-to-one name="optionSet" class="org.hisp.dhis.option.OptionSet" column="optionsetid"
+      foreign-key="fk_trackedentityattribute_optionsetid" />
 
     <property name="inherit" column="inherit" />
 

=== removed file 'dhis-2/dhis-services/dhis-service-tracker/src/main/resources/org/hisp/dhis/trackedentity/hibernate/TrackedEntityAttributeOption.hbm.xml'
--- dhis-2/dhis-services/dhis-service-tracker/src/main/resources/org/hisp/dhis/trackedentity/hibernate/TrackedEntityAttributeOption.hbm.xml	2014-02-15 14:06:39 +0000
+++ dhis-2/dhis-services/dhis-service-tracker/src/main/resources/org/hisp/dhis/trackedentity/hibernate/TrackedEntityAttributeOption.hbm.xml	1970-01-01 00:00:00 +0000
@@ -1,22 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
-  "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-  "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd";
-  [<!ENTITY identifiableProperties SYSTEM "classpath://org/hisp/dhis/common/identifiableProperties.hbm">]
-  >
-  
-<hibernate-mapping>
-  <class name="org.hisp.dhis.trackedentity.TrackedEntityAttributeOption" table="trackedentityattributeoption">
-
-    <id name="id" column="trackedentityattributeoptionid">
-      <generator class="native" />
-    </id>
-    &identifiableProperties;
-
-    <property name="name" not-null="true" length="160" />
-
-    <many-to-one name="attribute" column="trackedentityattributeid" class="org.hisp.dhis.trackedentity.TrackedEntityAttribute"
-      foreign-key="fk_attributeoption_attributeid" />
-
-  </class>
-</hibernate-mapping>

=== modified file 'dhis-2/dhis-services/dhis-service-tracker/src/main/resources/org/hisp/dhis/trackedentityattributevalue/hibernate/TrackedEntityAttributeValue.hbm.xml'
--- dhis-2/dhis-services/dhis-service-tracker/src/main/resources/org/hisp/dhis/trackedentityattributevalue/hibernate/TrackedEntityAttributeValue.hbm.xml	2014-02-07 20:25:49 +0000
+++ dhis-2/dhis-services/dhis-service-tracker/src/main/resources/org/hisp/dhis/trackedentityattributevalue/hibernate/TrackedEntityAttributeValue.hbm.xml	2014-03-19 06:44:30 +0000
@@ -15,8 +15,5 @@
 
     <property name="value" />
 
-    <many-to-one name="attributeOption" class="org.hisp.dhis.trackedentity.TrackedEntityAttributeOption" column="trackedentityattributeoptionid"
-      foreign-key="fk_attributeValue_attributeoptionid" />
-
   </class>
 </hibernate-mapping>

=== removed file 'dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/trackedentity/TrackedEntityAttributeOptionServiceTest.java'
--- dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/trackedentity/TrackedEntityAttributeOptionServiceTest.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/trackedentity/TrackedEntityAttributeOptionServiceTest.java	1970-01-01 00:00:00 +0000
@@ -1,149 +0,0 @@
-package org.hisp.dhis.trackedentity;
-
-/*
- * Copyright (c) 2004-2014, University of Oslo
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * Neither the name of the HISP project nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import org.hisp.dhis.DhisSpringTest;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-
-/**
- * @author Chau Thu Tran
- * 
- * @version $ TrackedEntityAttributeOptionServiceTest.java Nov 5, 2013 4:25:29 PM $
- */
-public class TrackedEntityAttributeOptionServiceTest
-    extends DhisSpringTest
-{
-    @Autowired
-    private TrackedEntityAttributeService attributeService;
-
-    private TrackedEntityAttributeOption attributeOptionA;
-
-    private TrackedEntityAttributeOption attributeOptionB;
-
-    private TrackedEntityAttributeOption attributeOptionC;
-
-    private TrackedEntityAttribute attributeA;
-
-    private TrackedEntityAttribute attributeB;
-
-    @Override
-    public void setUpTest()
-    {
-        attributeA = createTrackedEntityAttribute( 'A' );
-        attributeB = createTrackedEntityAttribute( 'B' );
-
-        attributeService.addTrackedEntityAttribute( attributeA );
-        attributeService.addTrackedEntityAttribute( attributeB );
-
-        attributeOptionA = createTrackedEntityAttributeOption( 'A', attributeA );
-        attributeOptionB = createTrackedEntityAttributeOption( 'B', attributeA );
-        attributeOptionC = createTrackedEntityAttributeOption( 'C', attributeB );
-    }
-
-    @Test
-    public void testAddTrackedEntityAttributeOption()
-    {
-        int idA = attributeService.addTrackedEntityAttributeOption( attributeOptionA );
-        int idB = attributeService.addTrackedEntityAttributeOption( attributeOptionB );
-
-        assertNotNull( attributeService.getTrackedEntityAttributeOption( idA ) );
-        assertNotNull( attributeService.getTrackedEntityAttributeOption( idB ) );
-    }
-
-    @Test
-    public void testDeleteTrackedEntityAttributeGroup()
-    {
-        int idA = attributeService.addTrackedEntityAttributeOption( attributeOptionA );
-        int idB = attributeService.addTrackedEntityAttributeOption( attributeOptionB );
-
-        assertNotNull( attributeService.getTrackedEntityAttributeOption( idA ) );
-        assertNotNull( attributeService.getTrackedEntityAttributeOption( idB ) );
-
-        attributeService.deleteTrackedEntityAttributeOption( attributeOptionA );
-
-        assertNull( attributeService.getTrackedEntityAttributeOption( idA ) );
-        assertNotNull( attributeService.getTrackedEntityAttributeOption( idB ) );
-
-        attributeService.deleteTrackedEntityAttributeOption( attributeOptionB );
-
-        assertNull( attributeService.getTrackedEntityAttributeOption( idA ) );
-        assertNull( attributeService.getTrackedEntityAttributeOption( idB ) );
-    }
-
-    @Test
-    public void testUpdateTrackedEntityAttributeOption()
-    {
-        int idA = attributeService.addTrackedEntityAttributeOption( attributeOptionA );
-
-        assertNotNull( attributeService.getTrackedEntityAttributeOption( idA ) );
-
-        attributeOptionA.setName( "B" );
-        attributeService.updateTrackedEntityAttributeOption( attributeOptionA );
-
-        assertEquals( "B", attributeService.getTrackedEntityAttributeOption( idA ).getName() );
-    }
-
-    @Test
-    public void testGetTrackedEntityAttributeGroupById()
-    {
-        int idA = attributeService.addTrackedEntityAttributeOption( attributeOptionA );
-        int idB = attributeService.addTrackedEntityAttributeOption( attributeOptionB );
-
-        assertEquals( attributeOptionA, attributeService.getTrackedEntityAttributeOption( idA ) );
-        assertEquals( attributeOptionB, attributeService.getTrackedEntityAttributeOption( idB ) );
-    }
-
-    @Test
-    public void testGetTrackedEntityAttributeGroupByName()
-    {
-        int idA = attributeService.addTrackedEntityAttributeOption( attributeOptionA );
-
-        assertNotNull( attributeService.getTrackedEntityAttributeOption( idA ) );
-
-        assertEquals( attributeOptionA, attributeService.getTrackedEntityAttributeOption( attributeA, "AttributeOptionA" ) );
-    }
-
-    @Test
-    public void testGetTrackedEntityAttributeOptionByAttribute()
-    {
-        attributeService.addTrackedEntityAttributeOption( attributeOptionA );
-        attributeService.addTrackedEntityAttributeOption( attributeOptionB );
-        attributeService.addTrackedEntityAttributeOption( attributeOptionC );
-
-        assertTrue( equals( attributeService.getTrackedEntityAttributeOption( attributeA ), attributeOptionA, attributeOptionB ) );
-        assertTrue( equals( attributeService.getTrackedEntityAttributeOption( attributeB ), attributeOptionC ) );
-    }
-
-}
\ No newline at end of file

=== modified file 'dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/trackedentityattributevalue/TrackedEntityAttributeValueServiceTest.java'
--- dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/trackedentityattributevalue/TrackedEntityAttributeValueServiceTest.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/trackedentityattributevalue/TrackedEntityAttributeValueServiceTest.java	2014-03-19 06:44:30 +0000
@@ -41,7 +41,6 @@
 import org.hisp.dhis.organisationunit.OrganisationUnit;
 import org.hisp.dhis.organisationunit.OrganisationUnitService;
 import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeOption;
 import org.hisp.dhis.trackedentity.TrackedEntityAttributeService;
 import org.hisp.dhis.trackedentity.TrackedEntityInstance;
 import org.hisp.dhis.trackedentity.TrackedEntityInstanceService;
@@ -75,10 +74,6 @@
 
     private TrackedEntityAttribute attributeC;
 
-    private TrackedEntityAttributeOption attributeOpionA;
-
-    private TrackedEntityAttributeOption attributeOpionB;
-
     private TrackedEntityInstance entityInstanceA;
 
     private TrackedEntityInstance entityInstanceB;
@@ -97,10 +92,6 @@
 
     private TrackedEntityAttributeValue attributeValueC;
 
-    private TrackedEntityAttributeValue attributeValueD;
-
-    private TrackedEntityAttributeValue attributeValueE;
-
     @Override
     public void setUpTest()
     {
@@ -125,19 +116,9 @@
         attributeService.addTrackedEntityAttribute( attributeB );
         attributeService.addTrackedEntityAttribute( attributeC );
 
-        attributeOpionA = createTrackedEntityAttributeOption( 'A', attributeC );
-        attributeOpionB = createTrackedEntityAttributeOption( 'B', attributeC );
-
-        attributeService.addTrackedEntityAttributeOption( attributeOpionA );
-        attributeService.addTrackedEntityAttributeOption( attributeOpionB );
-
         attributeValueA = new TrackedEntityAttributeValue( attributeA, entityInstanceA, "A" );
         attributeValueB = new TrackedEntityAttributeValue( attributeB, entityInstanceA, "B" );
         attributeValueC = new TrackedEntityAttributeValue( attributeA, entityInstanceB, "C" );
-        attributeValueD = new TrackedEntityAttributeValue( attributeC, entityInstanceC, "AttributeOptionA" );
-        attributeValueD.setAttributeOption( attributeOpionA );
-        attributeValueE = new TrackedEntityAttributeValue( attributeC, entityInstanceD, "AttributeOptionB" );
-        attributeValueE.setAttributeOption( attributeOpionB );
     }
 
     @Test
@@ -381,15 +362,4 @@
         assertTrue( entityInstances.contains( entityInstanceA ) );
     }
 
-    @Test
-    public void testCountByEntityInstanceAttributeoption()
-    {
-        attributeValueService.addTrackedEntityAttributeValue( attributeValueA );
-        attributeValueService.addTrackedEntityAttributeValue( attributeValueD );
-        attributeValueService.addTrackedEntityAttributeValue( attributeValueE );
-
-        int count = attributeValueService.countByAttributeOption( attributeOpionA );
-        assertEquals( 1, count );
-    }
-
 }

=== modified file 'dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/trackedentityattributevalue/TrackedEntityAttributeValueStoreTest.java'
--- dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/trackedentityattributevalue/TrackedEntityAttributeValueStoreTest.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/trackedentityattributevalue/TrackedEntityAttributeValueStoreTest.java	2014-03-19 06:44:30 +0000
@@ -40,7 +40,6 @@
 import org.hisp.dhis.organisationunit.OrganisationUnit;
 import org.hisp.dhis.organisationunit.OrganisationUnitService;
 import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeOption;
 import org.hisp.dhis.trackedentity.TrackedEntityAttributeService;
 import org.hisp.dhis.trackedentity.TrackedEntityInstance;
 import org.hisp.dhis.trackedentity.TrackedEntityInstanceService;
@@ -73,10 +72,6 @@
 
     private TrackedEntityAttribute attributeC;
 
-    private TrackedEntityAttributeOption attributeOpionA;
-
-    private TrackedEntityAttributeOption attributeOpionB;
-
     private TrackedEntityInstance entityInstanceA;
 
     private TrackedEntityInstance entityInstanceB;
@@ -91,10 +86,6 @@
 
     private TrackedEntityAttributeValue attributeValueC;
 
-    private TrackedEntityAttributeValue attributeValueD;
-
-    private TrackedEntityAttributeValue attributeValueE;
-
     @Override
     public void setUpTest()
     {
@@ -119,19 +110,9 @@
         attributeService.addTrackedEntityAttribute( attributeB );
         attributeService.addTrackedEntityAttribute( attributeC );
 
-        attributeOpionA = createTrackedEntityAttributeOption( 'A', attributeC );
-        attributeOpionB = createTrackedEntityAttributeOption( 'B', attributeC );
-
-        attributeService.addTrackedEntityAttributeOption( attributeOpionA );
-        attributeService.addTrackedEntityAttributeOption( attributeOpionB );
-
         attributeValueA = new TrackedEntityAttributeValue( attributeA, entityInstanceA, "A" );
         attributeValueB = new TrackedEntityAttributeValue( attributeB, entityInstanceA, "B" );
         attributeValueC = new TrackedEntityAttributeValue( attributeA, entityInstanceB, "C" );
-        attributeValueD = new TrackedEntityAttributeValue( attributeC, entityInstanceC, "AttributeOptionA" );
-        attributeValueD.setAttributeOption( attributeOpionA );
-        attributeValueE = new TrackedEntityAttributeValue( attributeC, entityInstanceD, "AttributeOptionB" );
-        attributeValueE.setAttributeOption( attributeOpionB );
     }
 
     @Test
@@ -275,15 +256,4 @@
         assertTrue( entityInstances.contains( entityInstanceA ) );
     }
 
-    @Test
-    public void testCountByTrackedEntityAttributeoption()
-    {
-        attributeValueStore.saveVoid( attributeValueA );
-        attributeValueStore.saveVoid( attributeValueD );
-        attributeValueStore.saveVoid( attributeValueE );
-
-        int count = attributeValueStore.countByAttributeOption( attributeOpionA );
-        assertEquals( 1, count );
-    }
-
 }

=== modified file 'dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/deletion/DeletionHandler.java'
--- dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/deletion/DeletionHandler.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/deletion/DeletionHandler.java	2014-03-19 06:44:30 +0000
@@ -86,7 +86,6 @@
 import org.hisp.dhis.trackedentity.TrackedEntity;
 import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
 import org.hisp.dhis.trackedentity.TrackedEntityAttributeGroup;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeOption;
 import org.hisp.dhis.trackedentity.TrackedEntityAudit;
 import org.hisp.dhis.trackedentity.TrackedEntityForm;
 import org.hisp.dhis.trackedentity.TrackedEntityInstance;
@@ -539,16 +538,7 @@
     public void deleteTrackedEntityAttributeGroup( TrackedEntityAttributeGroup attributeGroup )
     {
     }
-    
-    public String allowDeleteTrackedEntityAttributeOption( TrackedEntityAttributeOption attributeOption )
-    {
-        return null;
-    }
-    
-    public void deleteTrackedEntityAttributeOption( TrackedEntityAttributeOption attributeOption )
-    {
-    }
-
+   
     public String allowDeleteRelationship( Relationship relationship )
     {
         return null;

=== modified file 'dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/DhisConvenienceTest.java'
--- dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/DhisConvenienceTest.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/DhisConvenienceTest.java	2014-03-19 06:44:30 +0000
@@ -104,10 +104,9 @@
 import org.hisp.dhis.relationship.RelationshipType;
 import org.hisp.dhis.resourcetable.ResourceTableService;
 import org.hisp.dhis.sqlview.SqlView;
-import org.hisp.dhis.trackedentity.TrackedEntityInstance;
 import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
 import org.hisp.dhis.trackedentity.TrackedEntityAttributeGroup;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeOption;
+import org.hisp.dhis.trackedentity.TrackedEntityInstance;
 import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue;
 import org.hisp.dhis.user.User;
 import org.hisp.dhis.user.UserAuthorityGroup;
@@ -1104,22 +1103,7 @@
 
         return attribute;
     }
-
-    /**
-     * @param uniqueCharacter A unique character to identify the object.
-     * @return TrackedEntityAttributeOption
-     */
-    public static TrackedEntityAttributeOption createTrackedEntityAttributeOption( char uniqueChar,
-        TrackedEntityAttribute attribute )
-    {
-        TrackedEntityAttributeOption attributeOption = new TrackedEntityAttributeOption();
-
-        attributeOption.setName( "AttributeOption" + uniqueChar );
-        attributeOption.setAttribute( attribute );
-
-        return attributeOption;
-    }
-
+    
     /**
      * @param uniqueCharacter A unique character to identify the object.
      * @return TrackedEntityAttributeGroup

=== modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/caseentry/ShowEventWithRegistrationFormAction.java'
--- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/caseentry/ShowEventWithRegistrationFormAction.java	2014-03-18 14:54:13 +0000
+++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/caseentry/ShowEventWithRegistrationFormAction.java	2014-03-19 06:44:30 +0000
@@ -45,6 +45,7 @@
 import org.hisp.dhis.program.ProgramService;
 import org.hisp.dhis.program.ProgramStage;
 import org.hisp.dhis.program.ProgramStageDataElement;
+import org.hisp.dhis.program.ProgramTrackedEntityAttribute;
 import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
 import org.hisp.dhis.trackedentity.TrackedEntityAttributeGroup;
 import org.hisp.dhis.trackedentity.TrackedEntityAttributeGroupService;
@@ -162,8 +163,8 @@
         if ( trackedEntityForm != null )
         {
             customRegistrationForm = trackedEntityFormService.prepareDataEntryFormForAdd( trackedEntityForm
-                .getDataEntryForm().getHtmlCode(), trackedEntityForm.getProgram(), healthWorkers, null, null,
-                i18n, format );
+                .getDataEntryForm().getHtmlCode(), trackedEntityForm.getProgram(), healthWorkers, null, null, i18n,
+                format );
         }
 
         if ( customRegistrationForm == null )
@@ -173,7 +174,10 @@
             programs.remove( program );
             for ( Program p : programs )
             {
-                attributesInProgram.addAll( p.getTrackedEntityAttributes() );
+                for ( ProgramTrackedEntityAttribute programAttribute : p.getAttributes() )
+                {
+                    attributesInProgram.add( programAttribute.getAttribute() );
+                }
             }
 
             attributeGroups = new ArrayList<TrackedEntityAttributeGroup>(

=== modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/AddRepresentativeAction.java'
--- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/AddRepresentativeAction.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/AddRepresentativeAction.java	2014-03-19 06:44:30 +0000
@@ -40,7 +40,6 @@
 import org.hisp.dhis.organisationunit.OrganisationUnit;
 import org.hisp.dhis.ouwt.manager.OrganisationUnitSelectionManager;
 import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeOption;
 import org.hisp.dhis.trackedentity.TrackedEntityAttributeService;
 import org.hisp.dhis.trackedentity.TrackedEntityInstance;
 import org.hisp.dhis.trackedentity.TrackedEntityInstanceService;
@@ -122,15 +121,7 @@
                     {
                         value = format.formatDate( TrackedEntityAttribute.getDateFromAge( Integer.parseInt( value ) ) );
                     }
-                    else if ( TrackedEntityAttribute.TYPE_COMBO.equalsIgnoreCase( attribute.getValueType() ) )
-                    {
-                        TrackedEntityAttributeOption option = attributeService.getTrackedEntityAttributeOption( Integer.parseInt( value ) );
-                        if ( option != null )
-                        {
-                            attributeValue.setAttributeOption( option );
-                            attributeValue.setValue( option.getName() );
-                        }
-                    }
+                    
                     entityInstanceAttributeValues.add( attributeValue );
                 }
             }

=== modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/AddTrackedEntityInstanceAction.java'
--- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/AddTrackedEntityInstanceAction.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/AddTrackedEntityInstanceAction.java	2014-03-19 06:44:30 +0000
@@ -47,7 +47,6 @@
 import org.hisp.dhis.relationship.RelationshipTypeService;
 import org.hisp.dhis.trackedentity.TrackedEntity;
 import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeOption;
 import org.hisp.dhis.trackedentity.TrackedEntityAttributeService;
 import org.hisp.dhis.trackedentity.TrackedEntityInstance;
 import org.hisp.dhis.trackedentity.TrackedEntityInstanceService;
@@ -168,16 +167,6 @@
                     {
                         value = format.formatDate( TrackedEntityAttribute.getDateFromAge( Integer.parseInt( value ) ) );
                     }
-                    else if ( TrackedEntityAttribute.TYPE_COMBO.equalsIgnoreCase( attribute.getValueType() ) )
-                    {
-                        TrackedEntityAttributeOption option = attributeService.getTrackedEntityAttributeOption( Integer
-                            .parseInt( value ) );
-                        if ( option != null )
-                        {
-                            attributeValue.setAttributeOption( option );
-                            attributeValue.setValue( option.getName() );
-                        }
-                    }
                     attributeValues.add( attributeValue );
                 }
                 else if ( attribute.getInherit() && relationship != null )

=== modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/GetAttributesByProgramAction.java'
--- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/GetAttributesByProgramAction.java	2014-03-18 14:54:13 +0000
+++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/GetAttributesByProgramAction.java	2014-03-19 06:44:30 +0000
@@ -38,6 +38,7 @@
 import org.hisp.dhis.common.comparator.IdentifiableObjectNameComparator;
 import org.hisp.dhis.program.Program;
 import org.hisp.dhis.program.ProgramService;
+import org.hisp.dhis.program.ProgramTrackedEntityAttribute;
 import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
 import org.hisp.dhis.trackedentity.TrackedEntityAttributeService;
 import org.hisp.dhis.trackedentity.TrackedEntityInstance;
@@ -111,7 +112,10 @@
         if ( id != null )
         {
             Program program = programService.getProgram( id );
-            attributes = program.getTrackedEntityAttributes();
+            for ( ProgramTrackedEntityAttribute programAttribute :  program.getAttributes() )
+            {
+                attributes.add(programAttribute.getAttribute() );
+            }
         }
         else
         {

=== modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/GetTrackedEntityInstanceAction.java'
--- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/GetTrackedEntityInstanceAction.java	2014-03-18 14:54:13 +0000
+++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/GetTrackedEntityInstanceAction.java	2014-03-19 06:44:30 +0000
@@ -43,6 +43,7 @@
 import org.hisp.dhis.program.ProgramInstance;
 import org.hisp.dhis.program.ProgramInstanceService;
 import org.hisp.dhis.program.ProgramService;
+import org.hisp.dhis.program.ProgramTrackedEntityAttribute;
 import org.hisp.dhis.relationship.Relationship;
 import org.hisp.dhis.relationship.RelationshipType;
 import org.hisp.dhis.relationship.RelationshipTypeService;
@@ -91,7 +92,7 @@
 
     @Autowired
     private ProgramInstanceService programInstanceService;
-    
+
     private I18n i18n;
 
     private I18nFormat format;
@@ -207,7 +208,7 @@
         {
             program = programService.getProgram( programId );
             trackedEntityForm = trackedEntityFormService.getTrackedEntityForm( program );
-           
+
             Collection<ProgramInstance> programInstances = programInstanceService.getProgramInstances( entityInstance,
                 program, ProgramInstance.STATUS_ACTIVE );
             ProgramInstance programIntance = null;
@@ -237,18 +238,21 @@
                 Collection<Program> programs = programService.getAllPrograms();
                 for ( Program p : programs )
                 {
-                    for ( TrackedEntityAttribute attribute : p.getTrackedEntityAttributes() )
+                    for ( ProgramTrackedEntityAttribute programAttribute : p.getAttributes() )
                     {
-                        if ( !attribute.getDisplayInListNoProgram() )
+                        if ( !programAttribute.getDisplayedInList() )
                         {
-                            attributes.remove( attribute );
+                            attributes.remove( programAttribute.getAttribute() );
                         }
                     }
                 }
             }
             else
             {
-                attributes = program.getTrackedEntityAttributes();
+                for ( ProgramTrackedEntityAttribute programAttribute : program.getAttributes() )
+                {
+                    attributes.add( programAttribute.getAttribute() );
+                }
             }
 
             for ( TrackedEntityAttribute attribute : attributes )

=== modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/SaveAttributeAction.java'
--- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/SaveAttributeAction.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/SaveAttributeAction.java	2014-03-19 06:44:30 +0000
@@ -33,13 +33,11 @@
 import javax.servlet.http.HttpServletRequest;
 
 import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.math.NumberUtils;
 import org.apache.struts2.ServletActionContext;
 import org.hisp.dhis.i18n.I18nFormat;
 import org.hisp.dhis.program.Program;
 import org.hisp.dhis.program.ProgramService;
 import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeOption;
 import org.hisp.dhis.trackedentity.TrackedEntityAttributeService;
 import org.hisp.dhis.trackedentity.TrackedEntityInstance;
 import org.hisp.dhis.trackedentity.TrackedEntityInstanceService;
@@ -179,48 +177,22 @@
                     {
                         value = format.formatDate( TrackedEntityAttribute.getDateFromAge( Integer.parseInt( value ) ) );
                     }
-                    
+
                     if ( attributeValue == null )
                     {
                         attributeValue = new TrackedEntityAttributeValue();
                         attributeValue.setEntityInstance( entityInstance );
                         attributeValue.setAttribute( attribute );
                         attributeValue.setValue( value.trim() );
-
-                        if ( TrackedEntityAttribute.TYPE_COMBO.equalsIgnoreCase( attribute.getValueType() ) )
-                        {
-                            TrackedEntityAttributeOption option = attributeService
-                                .getTrackedEntityAttributeOption( Integer.parseInt( value ) );
-
-                            if ( option != null )
-                            {
-                                attributeValue.setAttributeOption( option );
-                                attributeValue.setValue( option.getName() );
-                            }
-                        }
-
                         attributeValueService.addTrackedEntityAttributeValue( attributeValue );
-                        entityInstance.getAttributeValues().add( attributeValue );
                     }
                     else
                     {
-                        if ( TrackedEntityAttribute.TYPE_COMBO.equalsIgnoreCase( attribute.getValueType() ) )
-                        {
-                            TrackedEntityAttributeOption option = attributeService
-                                .getTrackedEntityAttributeOption( NumberUtils.toInt( value, 0 ) );
-                            if ( option != null )
-                            {
-                                attributeValue.setAttributeOption( option );
-                                attributeValue.setValue( option.getName() );
-                            }
-                        }
-                        else
-                        {
-                            attributeValue.setValue( value.trim() );
-                        }
+                        attributeValue.setValue( value.trim() );
                         attributeValueService.updateTrackedEntityAttributeValue( attributeValue );
-                        entityInstance.getAttributeValues().add( attributeValue );
                     }
+
+                    entityInstance.getAttributeValues().add( attributeValue );
                 }
                 else if ( attributeValue != null )
                 {

=== modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/UpdateTrackedEntityInstanceAction.java'
--- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/UpdateTrackedEntityInstanceAction.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/UpdateTrackedEntityInstanceAction.java	2014-03-19 06:44:30 +0000
@@ -35,14 +35,12 @@
 import javax.servlet.http.HttpServletRequest;
 
 import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.math.NumberUtils;
 import org.apache.struts2.ServletActionContext;
 import org.hisp.dhis.i18n.I18nFormat;
 import org.hisp.dhis.program.Program;
 import org.hisp.dhis.program.ProgramService;
 import org.hisp.dhis.trackedentity.TrackedEntity;
 import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeOption;
 import org.hisp.dhis.trackedentity.TrackedEntityAttributeService;
 import org.hisp.dhis.trackedentity.TrackedEntityInstance;
 import org.hisp.dhis.trackedentity.TrackedEntityInstanceService;
@@ -157,34 +155,12 @@
                         attributeValue.setEntityInstance( entityInstance );
                         attributeValue.setAttribute( attribute );
                         attributeValue.setValue( value.trim() );
-                        if ( TrackedEntityAttribute.TYPE_COMBO.equalsIgnoreCase( attribute.getValueType() ) )
-                        {
-                            TrackedEntityAttributeOption option = attributeService
-                                .getTrackedEntityAttributeOption( Integer.parseInt( value ) );
-                            if ( option != null )
-                            {
-                                attributeValue.setAttributeOption( option );
-                                attributeValue.setValue( option.getName() );
-                            }
-                        }
+
                         valuesForSave.add( attributeValue );
                     }
                     else
                     {
-                        if ( TrackedEntityAttribute.TYPE_COMBO.equalsIgnoreCase( attribute.getValueType() ) )
-                        {
-                            TrackedEntityAttributeOption option = attributeService
-                                .getTrackedEntityAttributeOption( NumberUtils.toInt( value, 0 ) );
-                            if ( option != null )
-                            {
-                                attributeValue.setAttributeOption( option );
-                                attributeValue.setValue( option.getName() );
-                            }
-                        }
-                        else
-                        {
-                            attributeValue.setValue( value.trim() );
-                        }
+                        attributeValue.setValue( value.trim() );
 
                         valuesForUpdate.add( attributeValue );
                         valuesForDelete.remove( attributeValue );

=== modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/ValidateTrackedEntityInstanceAction.java'
--- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/ValidateTrackedEntityInstanceAction.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/trackedentity/ValidateTrackedEntityInstanceAction.java	2014-03-19 06:44:30 +0000
@@ -43,10 +43,9 @@
 import org.hisp.dhis.ouwt.manager.OrganisationUnitSelectionManager;
 import org.hisp.dhis.program.Program;
 import org.hisp.dhis.program.ProgramService;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeOption;
-import org.hisp.dhis.trackedentity.TrackedEntityInstance;
 import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
 import org.hisp.dhis.trackedentity.TrackedEntityAttributeService;
+import org.hisp.dhis.trackedentity.TrackedEntityInstance;
 import org.hisp.dhis.trackedentity.TrackedEntityInstanceService;
 import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -149,18 +148,8 @@
                     {
                         value = format.formatDate( TrackedEntityAttribute.getDateFromAge( Integer.parseInt( value ) ) );
                     }
-                    else if ( TrackedEntityAttribute.TYPE_COMBO.equalsIgnoreCase( attribute.getValueType() ) )
-                    {
-                        TrackedEntityAttributeOption option = attributeService.getTrackedEntityAttributeOption( Integer
-                            .parseInt( value ) );
-                        if ( option != null )
-                        {
-                            attributeValue.setValue( option.getName() );
-                        }
-                    }
-
+                    
                     attributeValue.setValue( value );
-
                     attributeValues.add( attributeValue );
                 }
             }

=== modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/attributeFormDiv.vm'
--- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/attributeFormDiv.vm	2014-02-12 10:18:42 +0000
+++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/attributeFormDiv.vm	2014-03-19 06:44:30 +0000
@@ -19,8 +19,8 @@
 			#elseif( $attribute.valueType == "combo" )
 				<select  id="attr$attribute.id" name="attr$attribute.id" class=' #validate( "default"  $attribute.mandatory )' >
 					 <option value="">[$i18n.getString( "please_select" )]</option>
-				#foreach ($option in $attribute.attributeOptions )
-					<option value="$option.id" #if($value==$option.name) selected #end >$option.name</option>
+				#foreach ($option in $attribute.optionSet.options )
+					<option value="$option" #if($value==$option) selected #end >$option</option>
 				#end
 				</select>
 			#else 

=== modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/programEnrollmentForm.vm'
--- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/programEnrollmentForm.vm	2014-02-12 10:18:42 +0000
+++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/programEnrollmentForm.vm	2014-03-19 06:44:30 +0000
@@ -79,8 +79,8 @@
 								#elseif( $attribute.valueType == "combo" )
 									<select  id="attr$attribute.id" name="attr$attribute.id" class="{validate:{required:$mandatory}}" >
 										 <option value="">[$i18n.getString( "please_select" )]</option>
-										#foreach ($option in $attribute.attributeOptions )
-											<option value="$option.id" #if($attributeValue == $option.name) selected="selected" #end>$option.name</option>
+										#foreach ($option in $attribute.optionSet.options )
+											<option value="$option" #if($attributeValue == $option) selected="selected" #end>$option</option>
 										#end
 									</select>
 								#else 

=== modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/trackedEntityInstanceForm.vm'
--- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/trackedEntityInstanceForm.vm	2014-03-11 06:49:37 +0000
+++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/trackedEntityInstanceForm.vm	2014-03-19 06:44:30 +0000
@@ -64,8 +64,8 @@
 											 #elseif( $attribute.valueType == "combo" )  
 													 <select id="attr$attribute.id" name="attr$attribute.id" inherit="$!attribute.inherit" class="{validate:{required:$attribute.mandatory}}" >
 															 <option value="">[$i18n.getString( "please_select" )]</option>
-															 #foreach ($option in $attribute.attributeOptions )
-																	 <option value="$option.id" #if("$value"=="$option.name") selected #end>$option.name</option>
+															 #foreach ($option in $attribute.optionSet.options )
+																	 <option value="$option" #if("$value"=="$option") selected #end>$option</option>
 															 #end
 													 </select>
 											 #elseif( $attribute.valueType == "phoneNumber" ) 
@@ -113,8 +113,8 @@
 					#elseif( $attribute.valueType == "combo" )
 						<select  id="attr$attribute.id"  name="attr$attribute.id" inherit="$!attribute.inherit" class=' #validate( "default"  $attribute.mandatory )' >
 							 <option value="">[$i18n.getString( "please_select" )]</option>
-						#foreach ($option in $attribute.attributeOptions )
-							<option value="$option.id" #if($attributeValue == $option.name) selected="selected" #end>$option.name</option>
+						#foreach ($option in $attribute.optionSet.options )
+							<option value="$option" #if($attributeValue == $option) selected="selected" #end>$option</option>
 						#end
 						</select>
 					#elseif( $attribute.valueType == "users" )

=== modified file 'dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/beneficiaryenrollment/action/SaveMobileProgramEnrollmentAction.java'
--- dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/beneficiaryenrollment/action/SaveMobileProgramEnrollmentAction.java	2014-03-18 14:54:13 +0000
+++ dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/beneficiaryenrollment/action/SaveMobileProgramEnrollmentAction.java	2014-03-19 06:44:30 +0000
@@ -37,7 +37,6 @@
 
 import javax.servlet.http.HttpServletRequest;
 
-import org.apache.commons.lang.math.NumberUtils;
 import org.apache.struts2.StrutsStatics;
 import org.hisp.dhis.light.utils.FormUtils;
 import org.hisp.dhis.light.utils.ValueUtils;
@@ -50,10 +49,9 @@
 import org.hisp.dhis.program.ProgramStageInstanceService;
 import org.hisp.dhis.system.util.DateUtils;
 import org.hisp.dhis.system.util.MathUtils;
-import org.hisp.dhis.trackedentity.TrackedEntityInstance;
 import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeOption;
 import org.hisp.dhis.trackedentity.TrackedEntityAttributeService;
+import org.hisp.dhis.trackedentity.TrackedEntityInstance;
 import org.hisp.dhis.trackedentity.TrackedEntityInstanceService;
 import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue;
 import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService;
@@ -296,17 +294,6 @@
                     {
                         TrackedEntityAttributeValue patientAttributeValue = new TrackedEntityAttributeValue();
 
-                        if ( TrackedEntityAttribute.TYPE_COMBO.equalsIgnoreCase( patientAttribute.getValueType() ) )
-                        {
-                            TrackedEntityAttributeOption option = patientAttributeService.getTrackedEntityAttributeOption( NumberUtils.toInt(
-                                value, 0 ) );
-
-                            if ( option != null )
-                            {
-                                patientAttributeValue.setAttributeOption( option );
-                            }
-                        }
-
                         patientAttributeValue.setEntityInstance( patient );
                         patientAttributeValue.setAttribute( patientAttribute );
                         patientAttributeValue.setValue( value.trim() );

=== modified file 'dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/beneficiaryregistration/action/SaveBeneficiaryAction.java'
--- dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/beneficiaryregistration/action/SaveBeneficiaryAction.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-web/dhis-web-light/src/main/java/org/hisp/dhis/light/beneficiaryregistration/action/SaveBeneficiaryAction.java	2014-03-19 06:44:30 +0000
@@ -36,17 +36,15 @@
 
 import javax.servlet.http.HttpServletRequest;
 
-import org.apache.commons.lang.math.NumberUtils;
 import org.apache.struts2.StrutsStatics;
 import org.hisp.dhis.light.utils.ValueUtils;
 import org.hisp.dhis.organisationunit.OrganisationUnitService;
 import org.hisp.dhis.program.Program;
 import org.hisp.dhis.program.ProgramService;
 import org.hisp.dhis.system.util.MathUtils;
-import org.hisp.dhis.trackedentity.TrackedEntityInstance;
 import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeOption;
 import org.hisp.dhis.trackedentity.TrackedEntityAttributeService;
+import org.hisp.dhis.trackedentity.TrackedEntityInstance;
 import org.hisp.dhis.trackedentity.TrackedEntityInstanceService;
 import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue;
 import org.hisp.dhis.util.ContextUtils;
@@ -302,14 +300,13 @@
         Map<String, String> parameterMap = ContextUtils.getParameterMap( request );
 
         // Add Attributes
-       Collection<TrackedEntityAttribute> patientAttributes = patientAttributeService.getAllTrackedEntityAttributes();
+        Collection<TrackedEntityAttribute> patientAttributes = patientAttributeService.getAllTrackedEntityAttributes();
 
         for ( Program program : programs )
         {
             patientAttributes.removeAll( program.getAttributes() );
         }
 
-
         for ( TrackedEntityAttribute patientAttribute : patientAttributes )
         {
             patientAttributeSet.add( patientAttribute );
@@ -339,17 +336,6 @@
                 {
                     TrackedEntityAttributeValue patientAttributeValue = new TrackedEntityAttributeValue();
 
-                    if ( TrackedEntityAttribute.TYPE_COMBO.equalsIgnoreCase( patientAttribute.getValueType() ) )
-                    {
-                        TrackedEntityAttributeOption option = patientAttributeService
-                            .getTrackedEntityAttributeOption( NumberUtils.toInt( value, 0 ) );
-
-                        if ( option != null )
-                        {
-                            patientAttributeValue.setAttributeOption( option );
-                        }
-                    }
-
                     patientAttributeValue.setEntityInstance( patient );
                     patientAttributeValue.setAttribute( patientAttribute );
                     patientAttributeValue.setValue( value.trim() );

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/trackedentityattribute/AddAttributeAction.java'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/trackedentityattribute/AddAttributeAction.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/trackedentityattribute/AddAttributeAction.java	2014-03-19 06:44:30 +0000
@@ -28,13 +28,11 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-import java.util.List;
-
 import org.apache.commons.lang.StringUtils;
+import org.hisp.dhis.option.OptionService;
 import org.hisp.dhis.period.PeriodService;
 import org.hisp.dhis.period.PeriodType;
 import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeOption;
 import org.hisp.dhis.trackedentity.TrackedEntityAttributeService;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -59,6 +57,9 @@
     }
 
     @Autowired
+    private OptionService optionService;
+
+    @Autowired
     private PeriodService periodService;
 
     // -------------------------------------------------------------------------
@@ -99,14 +100,7 @@
     {
         this.mandatory = mandatory;
     }
-
-    private List<String> attrOptions;
-
-    public void setAttrOptions( List<String> attrOptions )
-    {
-        this.attrOptions = attrOptions;
-    }
-
+    
     private Boolean inherit;
 
     public void setInherit( Boolean inherit )
@@ -128,6 +122,13 @@
         this.unique = unique;
     }
 
+    private Integer optionSetId;
+
+    public void setOptionSetId( Integer optionSetId )
+    {
+        this.optionSetId = optionSetId;
+    }
+
     // For Local ID type
 
     private Boolean orgunitScope;
@@ -161,7 +162,7 @@
         TrackedEntityAttribute attribute = new TrackedEntityAttribute();
 
         attribute.setName( name );
-        attribute.setCode( StringUtils.isEmpty( code.trim() ) ? null : code  );
+        attribute.setCode( StringUtils.isEmpty( code.trim() ) ? null : code );
         attribute.setDescription( description );
         attribute.setValueType( valueType );
         attribute.setExpression( expression );
@@ -175,7 +176,7 @@
 
         inherit = (inherit == null) ? false : true;
         attribute.setInherit( inherit );
-        
+
         if ( valueType.equals( TrackedEntityAttribute.VALUE_TYPE_LOCAL_ID ) )
         {
             orgunitScope = (orgunitScope == null) ? false : orgunitScope;
@@ -195,22 +196,13 @@
             attribute.setOrgunitScope( orgunitScope );
             attribute.setProgramScope( programScope );
         }
+        else if ( valueType.equals( TrackedEntityAttribute.TYPE_COMBO ) )
+        {
+            attribute.setOptionSet( optionService.getOptionSet( optionSetId ) );
+        }
 
         attributeService.addTrackedEntityAttribute( attribute );
 
-        if ( TrackedEntityAttribute.TYPE_COMBO.equalsIgnoreCase( valueType ) )
-        {
-            TrackedEntityAttributeOption opt = null;
-            for ( String optionName : attrOptions )
-            {
-                opt = new TrackedEntityAttributeOption();
-                opt.setName( optionName );
-                opt.setAttribute( attribute );
-                attribute.addAttributeOptions( opt );
-                attributeService.addTrackedEntityAttributeOption( opt );
-            }
-        }
-
         return SUCCESS;
     }
 }
\ No newline at end of file

=== removed file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/trackedentityattribute/RemoveAttributeOptionAction.java'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/trackedentityattribute/RemoveAttributeOptionAction.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/trackedentityattribute/RemoveAttributeOptionAction.java	1970-01-01 00:00:00 +0000
@@ -1,119 +0,0 @@
-package org.hisp.dhis.trackedentity.action.trackedentityattribute;
-
-/*
- * Copyright (c) 2004-2014, University of Oslo
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * Neither the name of the HISP project nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-import org.hisp.dhis.i18n.I18n;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeOption;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeService;
-import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService;
-
-import com.opensymphony.xwork2.Action;
-
-/**
- * @author Viet
- */
-public class RemoveAttributeOptionAction
-    implements Action
-{
-    // -------------------------------------------------------------------------
-    // Dependencies
-    // -------------------------------------------------------------------------
-
-    private TrackedEntityAttributeService attributeService;
-
-    public void setAttributeService( TrackedEntityAttributeService attributeService )
-    {
-        this.attributeService = attributeService;
-    }
-
-    private TrackedEntityAttributeValueService attributeValueService;
-
-    public void setAttributeValueService( TrackedEntityAttributeValueService attributeValueService )
-    {
-        this.attributeValueService = attributeValueService;
-    }
-
-    // -------------------------------------------------------------------------
-    // Input/Output
-    // -------------------------------------------------------------------------
-
-    private int id;
-
-    public void setId( int id )
-    {
-        this.id = id;
-    }
-
-    private String message;
-
-    public String getMessage()
-    {
-        return message;
-    }
-
-    private I18n i18n;
-
-    public void setI18n( I18n i18n )
-    {
-        this.i18n = i18n;
-    }
-
-    // -------------------------------------------------------------------------
-    // Action implementation
-    // -------------------------------------------------------------------------
-
-    public String execute()
-        throws Exception
-    {
-        TrackedEntityAttributeOption attributeOption = attributeService.getTrackedEntityAttributeOption( id );
-
-        if ( attributeOption != null )
-        {
-            int count = attributeValueService.countByAttributeOption( attributeOption );
-            if ( count > 0 )
-            {
-                message = i18n.getString( "warning_delete_tracked_entity_attribute_option" );
-                return INPUT;
-            }
-            else
-            {
-                attributeService.deleteTrackedEntityAttributeOption( attributeOption );
-                message = i18n.getString( "success_delete_tracked_entity_attribute_option" );
-                return SUCCESS;
-            }
-        }
-        else
-        {
-            message = i18n.getString( "error_delete_tracked_entity_attribute_option" );
-            return ERROR;
-        }
-
-    }
-
-}

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/trackedentityattribute/ShowAddAttributeFormAction.java'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/trackedentityattribute/ShowAddAttributeFormAction.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/trackedentityattribute/ShowAddAttributeFormAction.java	2014-03-19 06:44:30 +0000
@@ -31,8 +31,11 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import org.hisp.dhis.option.OptionService;
+import org.hisp.dhis.option.OptionSet;
 import org.hisp.dhis.period.PeriodService;
 import org.hisp.dhis.period.PeriodType;
+import org.springframework.beans.factory.annotation.Autowired;
 
 import com.opensymphony.xwork2.Action;
 
@@ -55,17 +58,27 @@
         this.periodService = periodService;
     }
 
+    @Autowired
+    private OptionService optionService;
+
     // -------------------------------------------------------------------------
     // Output
     // -------------------------------------------------------------------------
 
-    private List<PeriodType> periodTypes = new ArrayList<PeriodType>();
+    private List<PeriodType> periodTypes;
 
     public List<PeriodType> getPeriodTypes()
     {
         return periodTypes;
     }
 
+    private List<OptionSet> optionSets;
+
+    public List<OptionSet> getOptionSets()
+    {
+        return optionSets;
+    }
+
     // -------------------------------------------------------------------------
     // Getters && Setters
     // -------------------------------------------------------------------------
@@ -75,7 +88,8 @@
         throws Exception
     {
         periodTypes = periodService.getAllPeriodTypes();
-
+        optionSets =  new ArrayList<OptionSet>(optionService.getAllOptionSets());
+        
         return SUCCESS;
     }
 

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/trackedentityattribute/ShowUpdateAttributeAction.java'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/trackedentityattribute/ShowUpdateAttributeAction.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/trackedentityattribute/ShowUpdateAttributeAction.java	2014-03-19 06:44:30 +0000
@@ -32,12 +32,15 @@
 import java.util.Collection;
 import java.util.List;
 
+import org.hisp.dhis.option.OptionService;
+import org.hisp.dhis.option.OptionSet;
 import org.hisp.dhis.period.PeriodService;
 import org.hisp.dhis.period.PeriodType;
 import org.hisp.dhis.program.Program;
 import org.hisp.dhis.program.ProgramService;
 import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
 import org.hisp.dhis.trackedentity.TrackedEntityAttributeService;
+import org.springframework.beans.factory.annotation.Autowired;
 
 import com.opensymphony.xwork2.Action;
 
@@ -72,6 +75,9 @@
         this.periodService = periodService;
     }
 
+    @Autowired
+    private OptionService optionService;
+
     // -------------------------------------------------------------------------
     // Input/Output
     // -------------------------------------------------------------------------
@@ -97,13 +103,20 @@
         return programs;
     }
 
-    private List<PeriodType> periodTypes = new ArrayList<PeriodType>();
+    private List<PeriodType> periodTypes;
 
     public List<PeriodType> getPeriodTypes()
     {
         return periodTypes;
     }
 
+    private List<OptionSet> optionSets;
+
+    public List<OptionSet> getOptionSets()
+    {
+        return optionSets;
+    }
+
     // -------------------------------------------------------------------------
     // Action implementation
     // -------------------------------------------------------------------------
@@ -119,6 +132,8 @@
 
         periodTypes = periodService.getAllPeriodTypes();
 
+        optionSets = new ArrayList<OptionSet>( optionService.getAllOptionSets() );
+
         return SUCCESS;
     }
 }

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/trackedentityattribute/UpdateAttributeAction.java'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/trackedentityattribute/UpdateAttributeAction.java	2014-03-18 08:10:10 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/java/org/hisp/dhis/trackedentity/action/trackedentityattribute/UpdateAttributeAction.java	2014-03-19 06:44:30 +0000
@@ -28,19 +28,12 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-import java.util.Collection;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-
 import org.apache.commons.lang.StringUtils;
-import org.apache.struts2.ServletActionContext;
+import org.hisp.dhis.option.OptionService;
 import org.hisp.dhis.period.PeriodService;
 import org.hisp.dhis.period.PeriodType;
 import org.hisp.dhis.trackedentity.TrackedEntityAttribute;
-import org.hisp.dhis.trackedentity.TrackedEntityAttributeOption;
 import org.hisp.dhis.trackedentity.TrackedEntityAttributeService;
-import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import com.opensymphony.xwork2.Action;
@@ -65,12 +58,8 @@
         this.attributeService = attributeService;
     }
 
-    private TrackedEntityAttributeValueService attributeValueService;
-
-    public void setAttributeValueService( TrackedEntityAttributeValueService attributeValueService )
-    {
-        this.attributeValueService = attributeValueService;
-    }
+    @Autowired
+    private OptionService optionService;
 
     @Autowired
     private PeriodService periodService;
@@ -128,11 +117,11 @@
         this.unique = unique;
     }
 
-    private List<String> attrOptions;
+    private Integer optionSetId;
 
-    public void setAttrOptions( List<String> attrOptions )
+    public void setOptionSetId( Integer optionSetId )
     {
-        this.attrOptions = attrOptions;
+        this.optionSetId = optionSetId;
     }
 
     private Boolean inherit;
@@ -182,7 +171,7 @@
         TrackedEntityAttribute attribute = attributeService.getTrackedEntityAttribute( id );
 
         attribute.setName( name );
-        attribute.setCode( StringUtils.isEmpty( code.trim() ) ? null : code  );
+        attribute.setCode( StringUtils.isEmpty( code.trim() ) ? null : code );
         attribute.setDescription( description );
         attribute.setValueType( valueType );
         attribute.setExpression( expression );
@@ -197,42 +186,6 @@
         inherit = (inherit == null) ? false : true;
         attribute.setInherit( inherit );
 
-        HttpServletRequest request = ServletActionContext.getRequest();
-
-        Collection<TrackedEntityAttributeOption> attributeOptions = attributeService.getTrackedEntityAttributeOption( attribute );
-
-        if ( attributeOptions != null && attributeOptions.size() > 0 )
-        {
-            String value = null;
-            for ( TrackedEntityAttributeOption option : attributeOptions )
-            {
-                value = request.getParameter( PREFIX_ATTRIBUTE_OPTION + option.getId() );
-                if ( StringUtils.isNotBlank( value ) )
-                {
-                    option.setName( value.trim() );
-                    attributeService.updateTrackedEntityAttributeOption( option );
-                    attributeValueService.updateTrackedEntityAttributeValues( option );
-                }
-            }
-        }
-
-        if ( attrOptions != null )
-        {
-            TrackedEntityAttributeOption opt = null;
-            for ( String optionName : attrOptions )
-            {
-                opt = attributeService.getTrackedEntityAttributeOption( attribute, optionName );
-                if ( opt == null )
-                {
-                    opt = new TrackedEntityAttributeOption();
-                    opt.setName( optionName );
-                    opt.setAttribute( attribute );
-                    attribute.addAttributeOptions( opt );
-                    attributeService.addTrackedEntityAttributeOption( opt );
-                }
-            }
-        }
-
         if ( valueType.equals( TrackedEntityAttribute.VALUE_TYPE_LOCAL_ID ) )
         {
             orgunitScope = (orgunitScope == null) ? false : orgunitScope;
@@ -252,6 +205,10 @@
             attribute.setOrgunitScope( orgunitScope );
             attribute.setProgramScope( programScope );
         }
+        else if ( valueType.equals( TrackedEntityAttribute.TYPE_COMBO ) )
+        {
+            attribute.setOptionSet( optionService.getOptionSet( optionSetId ) );
+        }
 
         attributeService.updateTrackedEntityAttribute( attribute );
 

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/resources/META-INF/dhis/beans.xml'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/resources/META-INF/dhis/beans.xml	2014-02-17 15:00:27 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/resources/META-INF/dhis/beans.xml	2014-03-19 06:44:30 +0000
@@ -93,8 +93,6 @@
 		scope="prototype">
 		<property name="attributeService"
 			ref="org.hisp.dhis.trackedentity.TrackedEntityAttributeService" />
-		<property name="attributeValueService"
-			ref="org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService" />
 	</bean>
 
 	<bean
@@ -122,16 +120,6 @@
 	</bean>
 
 	<bean
-		id="org.hisp.dhis.trackedentity.action.trackedentityattribute.RemoveAttributeOptionAction"
-		class="org.hisp.dhis.trackedentity.action.trackedentityattribute.RemoveAttributeOptionAction"
-		scope="prototype">
-		<property name="attributeService"
-			ref="org.hisp.dhis.trackedentity.TrackedEntityAttributeService" />
-		<property name="attributeValueService"
-			ref="org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService" />
-	</bean>
-
-	<bean
 		id="org.hisp.dhis.trackedentity.action.trackedentityattribute.ShowAddAttributeFormAction"
 		class="org.hisp.dhis.trackedentity.action.trackedentityattribute.ShowAddAttributeFormAction"
 		scope="prototype">

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/resources/org/hisp/dhis/trackedentity/i18n_module.properties'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/resources/org/hisp/dhis/trackedentity/i18n_module.properties	2014-03-05 00:59:49 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/resources/org/hisp/dhis/trackedentity/i18n_module.properties	2014-03-19 06:44:30 +0000
@@ -89,7 +89,7 @@
 warning_delete_tracked_entity_attribute_option=This option has relationship with tracked entity attribute values
 success_delete_tracked_entity_attribute_option=Deleted tracked entity attribute option successfully
 error_delete_tracked_entity_attribute_option=Can not find tracked entity attribute option to delete
-attribute_combo_type=Predefined value
+attribute_combo_type=Option set type
 at_least_2_option=Please add at least two attribute options
 combo=Predefined value
 related=Related
@@ -483,4 +483,5 @@
 create_new_tracked_entity = Create new tracked entity
 tracked_entity_details = Tracked entity details
 edit_tracked_entity = Edit tracked entity
-confirm_delete_tracked_entity = Are you sure you want to delete this tracked entity?
\ No newline at end of file
+confirm_delete_tracked_entity = Are you sure you want to delete this tracked entity?
+option_set = Option set
\ No newline at end of file

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/resources/struts.xml'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/resources/struts.xml	2014-02-17 15:00:27 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/resources/struts.xml	2014-03-19 06:44:30 +0000
@@ -140,7 +140,7 @@
 		</action>
 
 		<action name="showAddAttributeForm"
-			class="org.hisp.dhis.trackedentity.action.program.GetUnAnonymousProgramAction">
+			class="org.hisp.dhis.trackedentity.action.trackedentityattribute.ShowAddAttributeFormAction">
 			<result name="success" type="velocity">/main.vm</result>
 			<param name="page">
 				/dhis-web-maintenance-program/addAttributeForm.vm</param>
@@ -177,20 +177,6 @@
 			<param name="onExceptionReturn">plainTextError</param>
 		</action>
 
-		<action name="removeAttributeOption"
-			class="org.hisp.dhis.trackedentity.action.trackedentityattribute.RemoveAttributeOptionAction">
-			<result name="success" type="velocity-json">
-				/dhis-web-commons/ajax/jsonResponseSuccess.vm
-			</result>
-			<result name="error" type="velocity-json">
-				/dhis-web-commons/ajax/jsonResponseError.vm
-			</result>
-			<result name="input" type="velocity-json">
-				/dhis-web-commons/ajax/jsonResponseInput.vm
-			</result>
-			<param name="requiredAuthorities">F_TRACKED_ENTITY_ATTRIBUTE_DELETE</param>
-		</action>
-
 		<action name="attributeVisitSchedule"
 			class="org.hisp.dhis.trackedentity.action.trackedentityattribute.ShowAttributeVisitScheduleFormAction">
 			<result name="success" type="velocity">/main.vm</result>

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/addAttributeForm.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/addAttributeForm.vm	2014-02-07 20:25:49 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/addAttributeForm.vm	2014-03-19 06:44:30 +0000
@@ -1,5 +1,4 @@
 <script type="text/javascript" src="javascript/addAttributeForm.js"></script>
-																		
 <h3>$i18n.getString( "create_new_tracked_entity_attribute" )</h3>
 <form id="addAttributeForm" action="addAttribute.action" method="post" class="inputForm">
 
@@ -54,7 +53,7 @@
     <tr>
         <td><label for="valueType">$i18n.getString( "value_type" ) <em title="$i18n.getString( 'required' )" class="required">*</em></label></td>
         <td>
-            <select id="valueType" name="valueType" onchange="ATTRIBUTE_OPTION.selectValueType(this);">
+            <select id="valueType" name="valueType" onchange="typeOnChange();">
                 <option value="number" selected="selected">$i18n.getString( "number" )</option>
                 <option value="string">$i18n.getString( "text" )</option>
                 <option value="letter">$i18n.getString( "letter_only" )</option>
@@ -71,11 +70,14 @@
         </td>
         <td></td>
     </tr>  
-	<tr id="attributeComboRow"> 
-		<td><label>$i18n.getString( "attribute_options" ) <em title="$i18n.getString( 'required' )" class="required">*</em></label></td>
-		<td><table id="attrOptionContainer"></table><a href="#" style="text-decoration: none;margin-top: 0.5em" onclick="ATTRIBUTE_OPTION.addOption()">[ $i18n.getString( "add_more_option" ) ]</a>
+	<tr id="optionSetRow"> 
+		<td><label>$i18n.getString( "option_set" ) <em title="$i18n.getString( 'required' )" class="required">*</em></label></td>
+		<td><select id="optionSetId" name="optionSetId" class="{validate:{required:true}}">
+				#foreach($optionSet in $optionSets)
+					<option value="$optionSet.id">$optionSet.name</option>
+				#end
+			</select>
 		</td>
-		<td><span id="attrMessage" name="attrMessage" style="color:red;"></span></td>
 	</tr>
 	
 	<tr name='localIdField' style='display:none;'>

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/addValidationCriteria.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/addValidationCriteria.vm	2014-02-07 20:25:49 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/addValidationCriteria.vm	2014-03-19 06:44:30 +0000
@@ -28,8 +28,8 @@
 						<option value="" selected="selected">[$i18n.getString( "please_select" )]</option>
 						#foreach($programAttribute in $program.programAttributes)
 							#set($opt="")
-							#foreach($option in $programAttribute.attribute.attributeOptions)
-								#set($opt=$opt + ';' + $option.name )
+							#foreach($option in $programAttribute.attribute.optionSet.options)
+								#set($opt=$opt + ';' + $option )
 							#end 
 						<option value="$programAttribute.attribute.uid" opt="$opt">$programAttribute.attribute.displayName</option>
 						#end

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/addAttributeForm.js'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/addAttributeForm.js	2014-02-07 20:25:49 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/addAttributeForm.js	2014-03-19 06:44:30 +0000
@@ -1,21 +1,7 @@
 jQuery(document).ready(	function(){
 		validation( 'addAttributeForm', function(form){
-			if( isSubmit && ATTRIBUTE_OPTION.checkOnSubmit() ) {
-				form.submit(i18n_field_is_required);
-			}
-		}, function(){
-			isSubmit = true;
-			
-			var fields = jQuery("#addAttributeForm").serializeArray();
-			jQuery.each(fields, function(i, field) {
-				if(  field.name.match("^attrOption")=='attrOption' && field.value == ""){
-					setInnerHTML("attrMessage", i18n_field_is_required);
-					isSubmit = false;
-				}
-			});
-		}); 
-		
-		jQuery("#attributeComboRow").hide();
-		
+			form.submit();
+		})
+	
 		checkValueIsExist( "name", "validateAttribute.action");
 	});	
\ No newline at end of file

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/attribute.js'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/attribute.js	2014-02-07 20:25:49 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/attribute.js	2014-03-19 06:44:30 +0000
@@ -60,106 +60,20 @@
 	removeItem( context.id, context.name, i18n_confirm_delete, 'removeAttribute.action' );
 }
 
-ATTRIBUTE_OPTION = 
-{
-	selectValueType : 	function (this_)
-	{
-		if ( jQuery(this_).val() == "combo" )
-		{
-			showById("attributeComboRow");
-			if( jQuery("#attrOptionContainer").find("input").length ==0 ) 
-			{
-				ATTRIBUTE_OPTION.addOption();
-				ATTRIBUTE_OPTION.addOption();
-			}
-		}
-		else if (jQuery(this_).val() == "calculated"){
-			if( jQuery("#availableAttribute option").length == 0 )
-			{
-				jQuery.getJSON( 'getCalattributeParams.action', { },
-					function ( json ) {
-						var attributes = jQuery("#availableAttribute");
-						attributes.append( "<option value='[current_date:0]' title='" + i18n_current_date + "'>" + i18n_current_date + "</option>" );
-						for ( i in json.programs ) 
-						{ 
-							var id = "[PG:" + json.programs[i].id + ".dateOfIncident]";
-							attributes.append( "<option value='" + id + "' title='" + json.programs[i].name + "( " +  i18n_incident_date + " )" + "'>" + json.programs[i].name + "( " +  i18n_incident_date + " )" + "</option>" );
-							var id = "[PG:" + json.programs[i].id + ".enrollmentDate]";
-							attributes.append( "<option value='" + id + "' title='" + json.programs[i].name + "( " +  i18n_enrollment_date + " )" + "'>" + json.programs[i].name + "( " +  i18n_enrollment_date + " )" + "</option>" );
-						}
-						for ( i in json.attributes ) 
-						{ 
-							var id = "[CA:" + json.attributes[i].id + "]";
-							attributes.append( "<option value='" + id + "' title='" + json.attributes[i].name + "'>" + json.attributes[i].name + "</option>" );
-						}
-				});
-			}
-			hideById("attributeComboRow");
-		}
-		else
-		{
-			hideById("attributeComboRow");
-		}
-		typeOnChange();
-	},
-	checkOnSubmit : function ()
-	{
-		if( jQuery("#valueType").val() != "combo" ) 
-		{
-			jQuery("#attrOptionContainer").children().remove();
-			return true;
-		}else {
-			$("input","#attrOptionContainer").each(function(){ 
-				if( !jQuery(this).val() )
-					jQuery(this).remove();
-			});
-			if( $("input","#attrOptionContainer").length < 2)
-			{
-				alert(i118_at_least_2_option);
-				return false;
-			}else return true;
-		}
-	},
-	addOption : function ()
-	{
-		jQuery("#attrOptionContainer").append(ATTRIBUTE_OPTION.createInput());
-	},
-	remove : function (this_, optionId)
-	{
-		
-		if( jQuery(this_).siblings("input").attr("name") != "attrOptions")
-		{
-			jQuery.get("removeattributeOption.action?id="+optionId,function(data){
-				if( data.response == "success")
-				{
-					jQuery(this_).parent().parent().remove();
-					showSuccessMessage( data.message );
-				}else 
-				{
-					showErrorMessage( data.message );
-				}
-			});
-		}else
-		{
-			jQuery(this_).parent().parent().remove();
-		}
-	},
-	removeInAddForm : function(this_)
-	{
-		jQuery(this_).parent().parent().remove();
-	},
-	createInput : function ()
-	{
-		return "<tr><td><input type='text' name='attrOptions' /><a href='#' style='text-decoration: none; margin-left:0.5em;' title='"+i18n_remove_option+"'  onClick='ATTRIBUTE_OPTION.remove(this,null)'>[ - ]</a></td></tr>";
-	}
-}
 
 function typeOnChange() {
-  var type = getFieldValue('valueType');
-  if( type == 'localId' ) {
-    jQuery('[name=localIdField]').show();
-  }
-  else {
-    jQuery('[name=localIdField]').hide();
-  }
+	var type = getFieldValue('valueType');
+	if( type=="combo"){
+		showById("optionSetRow");
+		jQuery('[name=localIdField]').hide();
+	}
+	else if( type == 'localId' ) {
+		jQuery('[name=localIdField]').show();
+		hideById("optionSetRow");
+	}
+	else {
+		jQuery('[name=localIdField]').hide();
+		hideById("optionSetRow");
+	}
 }
+

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/updateAttributeForm.js'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/updateAttributeForm.js	2014-02-07 20:25:49 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/updateAttributeForm.js	2014-03-19 06:44:30 +0000
@@ -1,21 +1,7 @@
 jQuery(document).ready(	function(){
 	validation( 'updateAttributeForm', function(form){
-		if( isSubmit && ATTRIBUTE_OPTION.checkOnSubmit() ) {
-			form.submit(i18n_field_is_required);
-		}
-	}, function(){
-		isSubmit = true;
-		
-		var fields = $("#addAttributeForm").serializeArray();
-		jQuery.each(fields, function(i, field) {
-			if(  field.name.match("^attrOption")=='attrOption' && field.value == ""){
-				setInnerHTML("attrMessage", i18n_field_is_required);
-				isSubmit = false;
-			}
-		});
+		form.submit();
 	});
 	
-	ATTRIBUTE_OPTION.selectValueType(byId("valueType"));
-	
 	checkValueIsExist( "name", "validateAttribute.action", {id:getFieldValue('id')});
 });		
\ No newline at end of file

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/jsonParamsByProgram.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/jsonParamsByProgram.vm	2014-02-07 20:25:49 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/jsonParamsByProgram.vm	2014-03-19 06:44:30 +0000
@@ -13,7 +13,7 @@
 	{
 		"id": "[CA:${attribute.id}]",
 		"name": "$!encoder.jsonEncode( ${attribute.name} )",
-		"suggested":"$attribute.attributeOptions"
+		"suggested":"$!attribute.optionSet.options"
 	}#if( $velocityCount < $size ),#end
 	#end
   ]

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/updateAttibuteForm.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/updateAttibuteForm.vm	2014-02-07 20:25:49 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/updateAttibuteForm.vm	2014-03-19 06:44:30 +0000
@@ -55,7 +55,7 @@
     <tr>
         <td>$i18n.getString( "value_type" ) <em title="$i18n.getString( "required" )" class="required">*</em></td>
         <td>
-            <select id="valueType" name="valueType" onchange="ATTRIBUTE_OPTION.selectValueType(this);">
+            <select id="valueType" name="valueType" onchange="typeOnChange();">
                 <option value="number" #if( $attribute.valueType == 'number' ) selected="selected" #end>$i18n.getString( "number" )</option>
                 <option value="string" #if( $attribute.valueType == 'string' ) selected="selected" #end>$i18n.getString( "text" )</option>
                 <option value="letter" #if( $attribute.valueType == 'letter' ) selected="selected" #end>$i18n.getString( "letter_only" )</option>
@@ -72,18 +72,14 @@
         </td>
     </tr>
       
-	<tr id="attributeComboRow"> 
-		<td><label>$i18n.getString( "attribute_options" ) <em title="$i18n.getString( "required" )" class="required">*</em></label></td>
-		<td >
-			<table id="attrOptionContainer">
-			 #foreach($option in $attribute.attributeOptions) 
-				<tr><td>
-					<input type='text' name='attrOption$option.id' value="$option.name" style="width:28em;"/><a href='#' style='text-decoration: none; margin-left:0.5em;' title='$i18n.getString( "remove_option" )'  onClick='ATTRIBUTE_OPTION.remove(this,$option.id)'>[ - ]</a>
-				</td>
-				</tr>
-			 #end
-		</table><a href="#" style="text-decoration: none;margin-top: 0.5em"  onclick="ATTRIBUTE_OPTION.addOption()">[ $i18n.getString( "add_more_option" ) ]</a></td>
-		<td><span id="attrMessage"  name="attrMessage" style="color:red;"></span></td>
+	<tr id="optionSetRow" #if($attribute.optionSet) #else class="hidden" #end> 
+		<td><label>$i18n.getString( "option_set" ) <em title="$i18n.getString( 'required' )" class="required">*</em></label></td>
+		<td><select id="optionSetId" name="optionSetId" class="{validate:{required:true}}">
+				#foreach($optionSet in $optionSets)
+					<option value="$optionSet.id" #if($attribute.optionSet.id==$optionSet.id) selected #end>$optionSet.name</option>
+				#end
+			</select>
+		</td>
 	</tr>
 
 	<tr name='localIdField' #if($attribute.valueType!='localId' ) style='display:none;' #end >

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/updateValidationCriteria.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/updateValidationCriteria.vm	2014-02-28 10:09:08 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/updateValidationCriteria.vm	2014-03-19 06:44:30 +0000
@@ -29,8 +29,8 @@
 								#set($attribute = '')
 								#foreach($programAttribute in $program.programAttributes)
 									#set($opt="")
-									#foreach($option in $programAttribute.attribute.attributeOptions)
-										#set($opt=$opt + ';' + $option.name )
+									#foreach($option in $programAttribute.attribute.optionSet.options)
+										#set($opt=$opt + ';' + $option )
 									#end 
 									<option value="$programPatientAttribute.patientAttribute.uid" opt="$opt" #if($validationCriteria.property==$programPatientAttribute.patientAttribute.uid) #set($attribute = $programPatientAttribute.patientAttribute) selected #end>$programPatientAttribute.patientAttribute.displayName</option>
 								#end
@@ -44,10 +44,10 @@
 							</select>
 						</td>
 						<td id='valueTD'>
-							#if($attribute.attributeOptions)
+							#if($attribute.optionSet.options)
 								<select id='value' name='value' class="{validate:{required:true}}" style="width:200px;">
-									#foreach($option in $attribute.attributeOptions.size()>0)
-									<option value="$option.name" #if($validationCriteria.value==$option.name) selected #end>$option.name</option>
+									#foreach($option in $attribute.optionSet.options)
+									<option value="$option" #if($validationCriteria.value==$option.name) selected #end>$option</option>
 									#end
 								</select>
 							#else

=== added file 'resources/sql/create-optionset-from-tei-attribute-option.sql'
--- resources/sql/create-optionset-from-tei-attribute-option.sql	1970-01-01 00:00:00 +0000
+++ resources/sql/create-optionset-from-tei-attribute-option.sql	2014-03-19 06:44:30 +0000
@@ -0,0 +1,8 @@
+INSERT INTO optionset ( optionsetid, name, lastupdated, created, version )
+select nextval('hibernate_sequence'), name || '_' || uid, now(), now(), 1 from trackedentityattribute where valuetype='combo';
+ 
+
+INSERT INTO optionsetmembers ( optionsetid, optionvalue, sort_order )
+select opt.optionsetid, teo.name,teo.trackedentityattributeoptionid from trackedentityattribute tea inner join trackedentityattributeoption teo 
+on tea.trackedentityattributeid=teo.trackedentityattributeid
+inner join optionset opt on opt.name=tea.name || '_' || tea.uid;
\ No newline at end of file