diff --git a/miosix/kernel/queue.h b/miosix/kernel/queue.h
index 56e5cd67ecf12722e7ca02ec74093348cc11d8ae..81f5217fc220a52b9307f7bdafa1568cb513460c 100644
--- a/miosix/kernel/queue.h
+++ b/miosix/kernel/queue.h
@@ -88,13 +88,6 @@ public:
      */
     void waitUntilNotFull();
 
-    /**
-     * Get an element from the queue. If the queue is empty, then sleep until
-     * an element becomes available.
-     * \param elem an element from the queue
-     */
-    void get(T& elem);
-
     /**
      * Put an element to the queue. If the queue is full, then sleep until a
      * place becomes available.
@@ -103,46 +96,53 @@ public:
     void put(const T& elem);
 
     /**
-     * Get an element from the queue, only if the queue is not empty.<br>
+     * Put an element to the queue, only if th queue is not full.<br>
      * Can ONLY be used inside an IRQ, or when interrupts are disabled.
-     * \param elem an element from the queue. The element is valid only if the
+     * \param elem element to add. The element has been added only if the
      * return value is true
-     * \return true if the queue was not empty
+     * \return true if the queue was not full.
      */
-    bool IRQget(T& elem);
+    bool IRQput(const T& elem);
 
     /**
-     * Get an element from the queue, only if the queue is not empty.<br>
+     * Put an element to the queue, only if th queue is not full.<br>
      * Can ONLY be used inside an IRQ, or when interrupts are disabled.
-     * \param elem an element from the queue. The element is valid only if the
+     * \param elem element to add. The element has been added only if the
      * return value is true
      * \param hppw is not modified if no thread is woken or if the woken thread
      * has a lower or equal priority than the currently running thread, else is
      * set to true
-     * \return true if the queue was not empty
+     * \return true if the queue was not full.
      */
-    bool IRQget(T& elem, bool& hppw);
+    bool IRQput(const T& elem, bool& hppw);
 
     /**
-     * Put an element to the queue, only if th queue is not full.<br>
+     * Get an element from the queue. If the queue is empty, then sleep until
+     * an element becomes available.
+     * \param elem an element from the queue
+     */
+    void get(T& elem);
+
+    /**
+     * Get an element from the queue, only if the queue is not empty.<br>
      * Can ONLY be used inside an IRQ, or when interrupts are disabled.
-     * \param elem element to add. The element has been added only if the
+     * \param elem an element from the queue. The element is valid only if the
      * return value is true
-     * \return true if the queue was not full.
+     * \return true if the queue was not empty
      */
-    bool IRQput(const T& elem);
+    bool IRQget(T& elem);
 
     /**
-     * Put an element to the queue, only if th queue is not full.<br>
+     * Get an element from the queue, only if the queue is not empty.<br>
      * Can ONLY be used inside an IRQ, or when interrupts are disabled.
-     * \param elem element to add. The element has been added only if the
+     * \param elem an element from the queue. The element is valid only if the
      * return value is true
      * \param hppw is not modified if no thread is woken or if the woken thread
      * has a lower or equal priority than the currently running thread, else is
      * set to true
-     * \return true if the queue was not full.
+     * \return true if the queue was not empty
      */
-    bool IRQput(const T& elem, bool& hppw);
+    bool IRQget(T& elem, bool& hppw);
 
     /**
      * Clear all items in the queue.<br>
@@ -215,35 +215,59 @@ void Queue<T,len>::waitUntilNotFull()
 }
 
 template <typename T, unsigned int len>
-void Queue<T,len>::get(T& elem)
+void Queue<T,len>::put(const T& elem)
 {
     FastInterruptDisableLock dLock;
     IRQwakeWaitingThread();
-    while(isEmpty())
+    while(isFull())
     {
         waiting=Thread::IRQgetCurrentThread();
         Thread::IRQenableIrqAndWait(dLock);
         IRQwakeWaitingThread();
     }
-    numElem--;
-    elem=buffer[getPos];
-    if(++getPos==len) getPos=0;
+    numElem++;
+    buffer[putPos]=elem;
+    if(++putPos==len) putPos=0;
 }
 
 template <typename T, unsigned int len>
-void Queue<T,len>::put(const T& elem)
+bool Queue<T,len>::IRQput(const T& elem)
+{
+    IRQwakeWaitingThread();
+    if(isFull()) return false;
+    numElem++;
+    buffer[putPos]=elem;
+    if(++putPos==len) putPos=0;
+    return true;
+}
+
+template <typename T, unsigned int len>
+bool Queue<T,len>::IRQput(const T& elem, bool& hppw)
+{
+    if(waiting && (Thread::IRQgetCurrentThread()->IRQgetPriority() <
+            waiting->IRQgetPriority())) hppw=true;
+    IRQwakeWaitingThread();
+    if(isFull()) return false;
+    numElem++;
+    buffer[putPos]=elem;
+    if(++putPos==len) putPos=0;
+    return true;
+}
+
+template <typename T, unsigned int len>
+void Queue<T,len>::get(T& elem)
 {
     FastInterruptDisableLock dLock;
     IRQwakeWaitingThread();
-    while(isFull())
+    while(isEmpty())
     {
         waiting=Thread::IRQgetCurrentThread();
         Thread::IRQenableIrqAndWait(dLock);
         IRQwakeWaitingThread();
     }
-    numElem++;
-    buffer[putPos]=elem;
-    if(++putPos==len) putPos=0;
+    numElem--;
+    elem=buffer[getPos];
+    if(++getPos==len) getPos=0;
 }
 
 template <typename T, unsigned int len>
@@ -270,30 +294,6 @@ bool Queue<T,len>::IRQget(T& elem, bool& hppw)
     return true;
 }
 
-template <typename T, unsigned int len>
-bool Queue<T,len>::IRQput(const T& elem)
-{
-    IRQwakeWaitingThread();
-    if(isFull()) return false;
-    numElem++;
-    buffer[putPos]=elem;
-    if(++putPos==len) putPos=0;
-    return true;
-}
-
-template <typename T, unsigned int len>
-bool Queue<T,len>::IRQput(const T& elem, bool& hppw)
-{
-    if(waiting && (Thread::IRQgetCurrentThread()->IRQgetPriority() <
-            waiting->IRQgetPriority())) hppw=true;
-    IRQwakeWaitingThread();
-    if(isFull()) return false;
-    numElem++;
-    buffer[putPos]=elem;
-    if(++putPos==len) putPos=0;
-    return true;
-}
-
 //This partial specialization is meant to to produce compiler errors in case an
 //attempt is made to instantiate a Queue with zero size, as it is forbidden
 template<typename T> class Queue<T,0> {};