diff --git a/lib_lista.c b/lib_lista.c
index a8fde076dbebb6fccb7e5585e737230cb44eeba5..df2079c885b25ebe8f6e0068d2ac5cab6da8767e 100644
--- a/lib_lista.c
+++ b/lib_lista.c
@@ -11,18 +11,22 @@ int inicializa_lista(t_lista *l)
 	if (sentinel == NULL)
 		return 0;
 
+	sentinel->prox = NULL;
 	sentinel->prev = l->ini;
+
 	l->ini = sentinel;
 	
 	sentinel = (t_nodo*) malloc (sizeof (t_nodo));
 	if (sentinel == NULL)
 		return 0;
 
-	l->ini->prox = sentinel;
+	sentinel->prox = NULL;
 	sentinel->prev = l->ini;
+
+	l->ini->prox = sentinel;
 	l->fim = sentinel;
-	l->atual = NULL;
 
+	l->atual = NULL;
 	l->tamanho = 0;
 
 	return 1;
@@ -38,11 +42,8 @@ int lista_vazia(t_lista *l)
 
 void destroi_lista(t_lista *l)
 {
-	if (l->ini == NULL && l->fim == NULL && l->tamanho == 0)
-	{
-		printf ("This list is already destroyed.\n");
+	if (l->ini == NULL && l->atual == NULL && l->fim == NULL && l->tamanho == 0)
 		return;
-	}
 
 	t_nodo *p;
 
diff --git a/lib_lista_complementar.c b/lib_lista_complementar.c
index 7e7c832f559dbad8db1a6ac9c6fb23dce3eedf55..7480e823ee9bfdf2cdd8a3a48bae0b0fa3b21ec8 100644
--- a/lib_lista_complementar.c
+++ b/lib_lista_complementar.c
@@ -54,19 +54,11 @@ int concatena_listas(t_lista *l, t_lista *c)
 {
 	int item;
 
-	if (!inicializa_atual_inicio(c))
-		return 0;
-
-	while (consulta_item_atual(&item, c))
-	{
+	while (remove_inicio_lista(&item, c))
 		if (!insere_fim_lista (item, l))
-			return 0;
-		incrementa_atual(c);
-	}
+			return 0;	
 
-	/* BUG
 	destroi_lista(c);
-	*/
 	return 1;
 }
 
@@ -74,7 +66,24 @@ int concatena_listas(t_lista *l, t_lista *c)
   Ordena a lista l em ordem crescente.
   Retorna 1 se a operação foi bem sucedida e zero caso contrário.
 */
-int ordena_lista(t_lista *l){return 1;}
+int ordena_lista(t_lista *l)
+{
+	t_lista aux;
+	if (!inicializa_lista(&aux))
+		return 0;
+
+	int item;
+	while (remove_fim_lista(&item, l))
+		if (!insere_ordenado_lista(item, &aux))
+			return 0;
+
+	if (!copia_lista(&aux, l))
+		return 0;
+
+	destroi_lista(&aux);
+
+	return 1;
+}
 
 /*
   Funcao que cria uma nova lista i pela intercalacao dos elementos
diff --git a/main.c b/main.c
index 738dcb68fa77f07b18675b2f660e6488e3594146..2a77806723228894d95db1154b2dc8d8e1a80d4d 100644
--- a/main.c
+++ b/main.c
@@ -8,24 +8,40 @@ int main()
 	inicializa_lista(&l);
 	inicializa_lista(&u);
 
+	printf("insere inicio e fim:\n");
 	insere_inicio_lista(10,&l);
 	insere_inicio_lista(20,&l);
 	insere_inicio_lista(5,&l);
 	insere_fim_lista(8,&l);
 	insere_fim_lista(12,&l);
 	insere_fim_lista(32,&l);
+	printf ("lista l: ");
 	imprime_lista(&l);
-	printf("\n");
+	printf("\n\n");
 
+	printf("copia:\n");
 	copia_lista(&l, &u);
+	printf ("lista u: ");
 	imprime_lista(&u);
-	printf("\n");
+	printf("\n\n");
 
+	printf("concatena:\n");
 	concatena_listas(&l, &u);
+	printf ("lista l: ");
 	imprime_lista(&l);
 	printf("\n");
+	printf ("lista u: ");
 	imprime_lista(&u);
+	printf("\n\n");
+
+	printf("ordena:\n");
+	ordena_lista(&l);
+	printf ("lista l: ");
+	imprime_lista(&l);
 	printf("\n");
 
+	destroi_lista(&l);
+	destroi_lista(&u);
+
 	return 0;
 }