public static <GItem> List<GItem> reverseList(final List<GItem> items) throws NullPointerException {
		if (items == null) throw new NullPointerException("items = null");
		return new AbstractList<GItem>() {

			@Override
			protected void removeRange(final int fromIndex, final int toIndex) {
				final int size = items.size();
				items.subList(size - toIndex, size - fromIndex).clear();
			}

			@Override
			public GItem get(final int index) {
				return items.get(items.size() - index - 1);
			}

			@Override
			public GItem set(final int index, final GItem item2) {
				return items.set(items.size() - index - 1, item2);
			}

			@Override
			public void add(final int index, final GItem item2) {
				items.add(items.size() - index, item2);
			}

			@Override
			public boolean retainAll(final Collection<?> items2) {
				return items.retainAll(items2);
			}

			@Override
			public GItem remove(final int index) {
				return items.remove(items.size() - index - 1);
			}

			@Override
			public boolean removeAll(final Collection<?> items2) {
				return items.removeAll(items2);
			}

			@Override
			public int size() {
				return items.size();
			}

			@Override
			public void clear() {
				items.clear();
			}

			@Override
			public boolean isEmpty() {
				return items.isEmpty();
			}

			@Override
			public int indexOf(final Object item2) {
				final int index = items.lastIndexOf(item2);
				return index < 0 ? -1 : items.size() - index - 1;
			}

			@Override
			public int lastIndexOf(final Object item2) {
				final int index = items.indexOf(item2);
				return index < 0 ? -1 : items.size() - index - 1;
			}

			@Override
			public boolean contains(final Object item2) {
				return items.contains(item2);
			}

			@Override
			public boolean containsAll(final Collection<?> items2) {
				return items.containsAll(items2);
			}

			@Override
			public Iterator<GItem> iterator() {
				return this.listIterator(0);
			}

			@Override
			public ListIterator<GItem> listIterator(int index) {
				final ListIterator<GItem> iterator = items.listIterator(items.size() - index);
				index = 0;
				return new ListIterator<GItem>() {

					@Override
					public boolean hasNext() {
						return iterator.hasPrevious();
					}

					@Override
					public boolean hasPrevious() {
						return iterator.hasNext();
					}

					@Override
					public void set(final GItem item2) {
						iterator.set(item2);
					}

					@Override
					public void add(final GItem item2) {
						iterator.add(item2);
						iterator.hasPrevious();
						iterator.previous();
					}

					@Override
					public GItem next() {
						return iterator.previous();
					}

					@Override
					public int nextIndex() {
						return items.size() - iterator.previousIndex() - 1;
					}

					@Override
					public GItem previous() {
						return iterator.next();
					}

					@Override
					public int previousIndex() {
						return items.size() - iterator.nextIndex() - 1;
					}

					@Override
					public void remove() {
						iterator.remove();
					}

				};
			}

			@Override
			public List<GItem> subList(final int fromIndex, final int toIndex) {
				return Collections.reverseList(items.subList(items.size() - toIndex - 2, items.size() - fromIndex - 2));
			}

		};
	}