diff --git a/UyTube_aplicacion/src/JPAControllerClasses/BusquedaEnBDD.java b/UyTube_aplicacion/src/JPAControllerClasses/BusquedaEnBDD.java
new file mode 100644
index 0000000000000000000000000000000000000000..aac884e47d83e965f45ca81862978f392f302106
--- /dev/null
+++ b/UyTube_aplicacion/src/JPAControllerClasses/BusquedaEnBDD.java
@@ -0,0 +1,270 @@
+package JPAControllerClasses;
+
+import Logica.Clases.Canal;
+import Logica.Clases.ListaDeReproduccion;
+import Logica.Clases.ListaDeReproduccion_;
+import Logica.Clases.Usuario;
+import Logica.Clases.Video;
+import Logica.DataType.DtVideo;
+import Logica.Enumerados.Filtrado;
+import Logica.Enumerados.Ordenacion;
+import Logica.Enumerados.TipoListaDeReproduccion;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Query;
+import javax.persistence.Persistence;
+
+public class BusquedaEnBDD implements Serializable {
+    private EntityManagerFactory emf = null;
+
+    public BusquedaEnBDD() {
+        this.emf = Persistence.createEntityManagerFactory(NombreManejador.getNombreManejador());
+    }
+    public BusquedaEnBDD(EntityManagerFactory emf) {
+        this.emf = emf;
+    }
+    public EntityManager getEntityManager() {
+        return emf.createEntityManager();
+    }
+    
+    /**
+     * Busca contenido por coincidencia de texto en nombre o descripcion de los
+     * contenidos del sistema En el resultado se incluirán (si corresponde segun
+     * el filtrado) los videos privados del usuarioActual
+     *
+     * @param busqueda Texto a buscar (si es vacío incluye todo el contenido)
+     * @param filtro Tipo de contenido en el cual se realizará la búsqueda
+     * @param orden Manera de ordenar el resultado de la búsqueda
+     * @return Resultado de la busqueda. Puede contener DtVideo,
+     * DtListaDeReproduccion y/o DtCanal. (para usar los elementos devueltos hay
+     * que castearlos)
+     */
+    public ArrayList<Object> buscar(String busqueda, Filtrado filtro, Ordenacion orden){
+        EntityManager em = getEntityManager();
+        List<Object> ret = new ArrayList();
+        if (busqueda == null || busqueda.equals("")) {
+        }else{
+            busqueda = "%" + busqueda + "%";
+        }
+        try {
+            Query q;
+            // Segun la opcion de filtrado, se obtienen los contenidos que contengan el texto a buscar
+            // Busca los Canales
+            if (filtro == Filtrado.TODO || filtro == Filtrado.CANALES){
+                if (busqueda == null || busqueda.equals("")){
+                   q = em.createQuery("SELECT e FROM Canal e");
+                }else{
+                   q = em.createQuery("SELECT e FROM Canal e WHERE (UPPER(e.nombre)) LIKE (UPPER(?1)) OR (UPPER(e.descripcion)) LIKE (UPPER(?1))");
+                    q.setParameter(1, busqueda);
+                }
+                ret.addAll(q.getResultList());
+            }
+            // Busca los Listas de reproduccion
+            if (filtro == Filtrado.TODO || filtro == Filtrado.LISTAS_DE_REPRODUCCION){
+                if (busqueda == null || busqueda.equals("")){
+                   q = em.createQuery("SELECT e FROM ListaDeReproduccion e WHERE e.tipo = ?1");
+                    q.setParameter(1, TipoListaDeReproduccion.PARTICULAR);
+                }else{
+                   q = em.createQuery("SELECT e FROM ListaDeReproduccion e WHERE e.tipo = ?1 AND (UPPER(e.nombre)) LIKE (UPPER(?2)) ");
+                    q.setParameter(1, TipoListaDeReproduccion.PARTICULAR);
+                    q.setParameter(2, busqueda);
+                }
+                ret.addAll(q.getResultList());
+            }
+            // Busca los Videos
+            if (filtro == Filtrado.TODO || filtro == Filtrado.VIDEOS){
+                if (busqueda == null || busqueda.equals("")){
+                   q = em.createQuery("SELECT e FROM Video e");
+                }else{
+                   q = em.createQuery("SELECT e FROM Video e WHERE (UPPER(e.nombre)) LIKE (UPPER(?1)) OR (UPPER(e.descripcion)) LIKE (UPPER(?1))");
+                    q.setParameter(1, busqueda);
+                }
+                ret.addAll(q.getResultList());
+            }
+            
+            // En este punto ret contiene todos los contenidos que contienen la busqueda en su nombre o descripcion
+            ArrayList<ParDeObjetos> pares = null;
+            ArrayList<ParDeObjetos> paresOrdenados;
+            switch (orden){
+                case ALFABETICA_ASCENDENTE:
+                    pares = nombrarElementos((ArrayList<Object>) ret);
+                    break;
+                case FECHA_DESCENDENTE:
+                    pares = fecharElementos((ArrayList<Object>) ret);
+                    break;
+            }
+            return ParDeObjetos.extraerElementos(
+                    ordenar(pares)
+            );
+        } finally {
+            em.close();
+        }
+    }
+
+    /**
+     * Devuelve un listado de Video y ListaDeReproduccion que pertenezcan ala
+     * categoria indicada, ordenado por fecha de actividasd reciente
+     * @param cat Categoria a buscar
+     * @return Lista ordenada Video y ListaDeReproduccion
+     */
+    public List<Object> buscarPorCategoria(String cat) {
+        EntityManager em = getEntityManager();
+        List<Object> ret = new ArrayList();
+        try {
+            Query q;
+            // Obtiene los videos en esa categoria
+            q = em.createQuery("SELECT v FROM Video v WHERE v.categoria = ?1");
+            q.setParameter(1, cat);
+            ret.addAll(q.getResultList());
+            // obtiene las listas de reproduccion en esa categoria
+            q = em.createQuery("SELECT l FROM ListaDeReproduccion l WHERE l.categoria = ?1");
+            q.setParameter(1, cat);
+            ret.addAll(q.getResultList());
+            
+            return ParDeObjetos.extraerElementos(
+                    ordenar(
+                            fecharElementos(
+                                    (ArrayList<Object>) ret
+                            )
+                    )
+            );
+        } finally {
+            em.close();
+        }
+    }
+    
+    /**
+     * Asocia los objetos recibidos a una fecha
+     * Canal se asocia a la fecha del video mas reciente
+     * Video a su propia fecha
+     * ListaDeReproduccion fecha del video con fecha mas reciente
+     * @param lista Lista de objetos a ordenar (Canal, Video o ListaDeReproduccion)
+     * @return Lista de los objetos recibidos pero asociados a una fecha
+     */
+    public ArrayList<ParDeObjetos> fecharElementos(ArrayList<Object> lista){
+        ArrayList<ParDeObjetos> ret = new ArrayList();
+        for (Object o : lista){
+            ret.add(new ParDeObjetos(o, ultimaActividad(o)));
+        }
+        return ret;
+    }
+    
+    /**
+     * Asocia los objetos recibidos a una fecha
+     * Canal se asocia a la fecha del video mas reciente
+     * Video a su propia fecha
+     * ListaDeReproduccion fecha del video con fecha mas reciente
+     * @param lista Lista de objetos a ordenar (Canal, Video o ListaDeReproduccion)
+     * @return Lista de los objetos recibidos pero asociados a una fecha
+     */
+    public ArrayList<ParDeObjetos> nombrarElementos(ArrayList<Object> lista){
+        ArrayList<ParDeObjetos> ret = new ArrayList();
+        for (Object o : lista){
+            ret.add(new ParDeObjetos(o, nombreParaOrdenar(o)));
+        }
+        return ret;
+    }
+    
+    /**
+     * Devuelve el nombre del objeto
+     * Canal su nombre
+     * Video su nombre
+     * ListaDeReproduccion su nombre
+     * @param o Objeto a dar nombre
+     * @return Nombre del objeto
+     */
+    private String nombreParaOrdenar(Object o){
+        java.sql.Date ret = null;
+        if (o.getClass() == Canal.class){
+            Canal c = (Canal) o;
+            return c.getNombre();
+        }else if (o.getClass() == ListaDeReproduccion.class){
+            ListaDeReproduccion l = (ListaDeReproduccion) o;
+            return l.getNombre();
+        }else if (o.getClass() == Video.class){
+            Video v = (Video) o;
+            return v.getNombre();
+        }
+        return "";
+    }
+    
+    /**
+     * Devuelve la fecha de la ultima actividad del objeto
+     * Canal es la fecha del video mas reciente
+     * Video su propia fecha
+     * ListaDeReproduccion la fecha del video con fecha mas reciente
+     * @param o
+     * @return 
+     */
+    private java.sql.Date ultimaActividad(Object o){
+        java.sql.Date ret = null;
+        if (o.getClass() == Canal.class){
+            Canal c = (Canal) o;
+            ArrayList<DtVideo> videos = c.listarVideos();
+            for (DtVideo dtv : videos){
+                if (ret == null || dtv.getFechaPublicacion().compareTo(ret) > 0){
+                    ret = dtv.getFechaPublicacion();
+                }
+            }
+        }else if (o.getClass() == ListaDeReproduccion.class){
+            ListaDeReproduccion l = (ListaDeReproduccion) o;
+            ArrayList<DtVideo> videos = l.listarVideos();
+            for (DtVideo dtv : videos){
+                if (ret == null || dtv.getFechaPublicacion().compareTo(ret) > 0){
+                    ret = dtv.getFechaPublicacion();
+                }
+            }
+        }else if (o.getClass() == Video.class){
+            Video v = (Video) o;
+            ret = v.getFechaPublicacion();
+        }
+        return ret;
+    }
+    
+    /**
+     * Ordena la lista de pares recibida
+     * @param lista Lista a ordenar
+     * @return Lista ordenada
+     */
+    public ArrayList<ParDeObjetos> ordenar(ArrayList<ParDeObjetos> lista){
+        if (lista == null || lista.isEmpty()){
+            return new ArrayList();
+        }
+        
+        ParDeObjetos par = lista.remove(0);
+        ArrayList<ParDeObjetos> listaOrdenada = ordenar(lista);
+        
+        int i = 0;
+        for (; i < listaOrdenada.size(); i++){
+            ParDeObjetos p = listaOrdenada.get(i);
+            if (comparar(p, par) < 0){
+                break;
+            }
+        }
+        listaOrdenada.add(i, par);
+        return listaOrdenada;
+    }
+    
+    /**
+     * Compara dos pares de objetos
+     * @param a Primer par a comparar
+     * @param b Segundo par a comparar
+     * @return 0 si (a == b), -1 si (a < b), 1 si (a > b)
+     */
+    private int comparar(ParDeObjetos a, ParDeObjetos b){
+        if (a.getOrderField().getClass() == String.class){
+            String str1 = (String) a.getOrderField();
+            String str2 = (String) b.getOrderField();
+            return (str1.compareToIgnoreCase(str2)) * -1;
+        }else if (a.getOrderField().getClass() == java.sql.Date.class){
+            java.sql.Date date1 = (java.sql.Date) a.getOrderField();
+            java.sql.Date date2 = (java.sql.Date) b.getOrderField();
+            return date1.compareTo(date2);
+        }
+        return 0;
+    }
+    
+}
diff --git a/UyTube_aplicacion/src/JPAControllerClasses/ParDeObjetos.java b/UyTube_aplicacion/src/JPAControllerClasses/ParDeObjetos.java
new file mode 100644
index 0000000000000000000000000000000000000000..8c38f83397175f66b759940cfe327f8138c1ebbf
--- /dev/null
+++ b/UyTube_aplicacion/src/JPAControllerClasses/ParDeObjetos.java
@@ -0,0 +1,40 @@
+package JPAControllerClasses;
+
+import java.util.ArrayList;
+
+public class ParDeObjetos {
+    private Object element;
+    private Object orderField;
+
+    public ParDeObjetos(Object element, Object orderField) {
+        this.element = element;
+        this.orderField = orderField;
+    }
+
+    public Object getElement() {
+        return element;
+    }
+
+    public void setElement(Object element) {
+        this.element = element;
+    }
+
+    public Object getOrderField() {
+        return orderField;
+    }
+
+    public void setOrderField(Object orderField) {
+        this.orderField = orderField;
+    }
+    
+    
+    public static ArrayList<Object> extraerElementos(ArrayList<ParDeObjetos> lista){
+        ArrayList<Object> ret = new ArrayList();
+        for (ParDeObjetos par : lista){
+            ret.add(par.getElement());
+        }
+        return ret;
+    }
+    
+    
+}
diff --git a/UyTube_aplicacion/src/Logica/DatosDePrueba.java b/UyTube_aplicacion/src/Logica/DatosDePrueba.java
index 31821ada086963ff4010315bb3fa9b0e86d96447..4a286e6c585388541c111d53f723e6f04fb8641f 100644
--- a/UyTube_aplicacion/src/Logica/DatosDePrueba.java
+++ b/UyTube_aplicacion/src/Logica/DatosDePrueba.java
@@ -1,16 +1,14 @@
 package Logica;
 
-import Logica.Clases.Usuario;
-import Logica.Controladores.CAdmin;
-import Logica.Controladores.CUsuario;
+import JPAControllerClasses.BusquedaEnBDD;
+import Logica.Clases.Canal;
+import Logica.Clases.ListaDeReproduccion;
+import Logica.Clases.Video;
+import Logica.Enumerados.Filtrado;
+import Logica.Enumerados.Ordenacion;
 import Logica.Interfaces.IAdmin;
-import Logica.DataType.*;
-import Logica.Enumerados.*;
 import Logica.Interfaces.IUsuario;
-import java.sql.Date;
-import java.sql.Time;
 import java.util.ArrayList;
-import java.util.Map;
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.Persistence;
@@ -34,13 +32,36 @@ public class DatosDePrueba {
         try {
             EntityManagerFactory factory = Persistence.createEntityManagerFactory("UyTubePU");
             EntityManager manager = factory.createEntityManager();
+            /*
+            for (Object o : new BusquedaEnBDD().buscarPorCategoria("MUSICA")){
+                if (o.getClass() == Video.class){
+                    Video i = (Video) o;
+                    System.out.println(i.getNombre());
+                }else if (o.getClass() == ListaDeReproduccion.class){
+                    ListaDeReproduccion i = (ListaDeReproduccion) o;
+                    System.out.println(i.getNombre());
+                }
+                
+                
+                
+            }
+            */
             
             
+            for (Object o : new BusquedaEnBDD().buscar("no", Filtrado.TODO, Ordenacion.ALFABETICA_ASCENDENTE)){
+                if (o.getClass() == Video.class){
+                    Video i = (Video) o;
+                    System.out.println(i.getNombre());
+                }else if (o.getClass() == ListaDeReproduccion.class){
+                    ListaDeReproduccion i = (ListaDeReproduccion) o;
+                    System.out.println(i.getNombre());
+                }else if (o.getClass() == Canal.class){
+                    Canal i = (Canal) o;
+                    System.out.println(i.getNombre());
+                }
+            }
             
             
-            /**
-             *  Escriba aqui el codigo de la prueba que quiera realizar...
-             */
             
         } catch (Exception e) {
             System.out.println("//////////////////////////");
@@ -49,4 +70,21 @@ public class DatosDePrueba {
         }
     }
     
+    
+    
+    /**
+     * Busca contenido por coincidencia de texto en nombre o descripcion de los
+     * contenidos del sistema que pertenezcan a la categoria indicada
+     *
+     * @param categoria Nombre de la categoria a buscar
+     * @return Resultado de la busqueda. Puede contener DtVideo y
+     * DtListaDeReproduccion. (para usar los elementos devueltos hay que
+     * castearlos)
+     */
+    public static ArrayList<Object> buscar(String categoria){
+        return null;
+    }
+    
+    
+    
 }
\ No newline at end of file
diff --git a/UyTube_aplicacion/src/Logica/Interfaces/IUsuario.java b/UyTube_aplicacion/src/Logica/Interfaces/IUsuario.java
index 1e10aff35481ab8a2dbd0d48e7b5f74f2d55d3b9..f47b5d688ee2a010ed855c41bf28da5e730aeaab 100644
--- a/UyTube_aplicacion/src/Logica/Interfaces/IUsuario.java
+++ b/UyTube_aplicacion/src/Logica/Interfaces/IUsuario.java
@@ -76,8 +76,9 @@ public interface IUsuario {
     public ArrayList<Object> buscar(String busqueda, Filtrado filtro, Ordenacion orden);
 
     /**
-     * Busca contenido por coincidencia de texto en nombre o descripcion de los
-     * contenidos del sistema que pertenezcan a la categoria indicada
+     * Busca contenido que pertenezcan a la categoria indicada El Resultado
+     * contendrá todos los contenidos publicos, y los contenidos privados del
+     * usuarioActual
      *
      * @param categoria Nombre de la categoria a buscar
      * @return Resultado de la busqueda. Puede contener DtVideo y